JavaRush /Курсы /Java Core /Многопоточность или многонитевость

Многопоточность или многонитевость

Java Core
6 уровень, 1 лекция
Открыта

— Привет, Амиго! У нас новая и очень трудная тема. Сочувствую. Часто она считается одной из самых сложных не только в Java, но и в программировании вообще. Это – многонитевость (multithreading).

Представь себе средненькую компьютерную игру, например, гонки на звездолетах. Ты летишь по просторам космоса, уворачиваясь от метеоритов и патрульных крейсеров, а с тобой еще два десятка таких же участников этих нелегальных гонок.

Допустим, ты решил написать такую же игру. Твоей программе придется отслеживать команды управления (ввод с клавиатуры), перемещать звездолеты, рассчитывать их траектории и последствия столкновения, а также отрисовывать все это на экране пользователя. Это очень сложная работа.

Вспомни, как мы решили «проблему большой сложности» в том примере про рост курьерской компании.

— Мы разделили ее на независимые отделы и жестко задали (стандартизировали) способы их взаимодействия.

— Но что делать, когда независимым частям нужно выполнить какой-то объем работы, параллельно с другими частями?! Ответ на этот вопрос – нити(трэды) (или как их неправильно называют – потоки).

Попробуй представить программу, как такого маленького робота, который бегает по коду и выполняет команды. Сначала выполнил команду, написанную в одной строке, затем перешел на следующую, и так далее.

— Представил. Ничего сложного!

— Отлично. А теперь представь, что таких роботов у тебя несколько. И пока один занимается вводом от пользователя, второй меняет объекты в соответствии с ним. Третий выполняет код, по отображению этих объектов на экран, а четвертый несколько раз в секунду проверяет – не столкнулись ли корабли и, в случае столкновения, просчитывает его результаты.

Таким образом, мы можем разделить программу не только на независимые части/объекты, но и добиться того, что эти части будут выполнять свою работу независимо друг от друга. А чем меньше взаимодействия между отдельными частями, тем меньше сложность программы.

Представь, что ты смог заменить менеджера – скриптом, рассылающим письма. А остальные отделы компании об этом даже не догадались. Такие примеры уже имели место в 26 веке и показали отличные результаты. Большинство менеджеров, и даже топ-менеджеров, может быть успешно заменено скриптом средней сложности. Только после вмешательства «профсоюза офисного планктона» удалось остановить массовые увольнения менеджеров. Но это так – отвлечение от темы.

— Как интересно.

— Мало того, что в программе может быть несколько таких «маленьких роботов», исполняющих код, так эти роботы могут еще общаться друг с другом и порождать новых роботов.

— Порождать новых роботов?

— Да, для выполнения новых задач. Иногда выгодно создать еще одного робота (еще одну нить), которая будет выполнять какое-то действие одновременно с текущей нитью (роботом).

— Думаю, что это хорошая вещь, хоть пока не могу придумать, где бы я этим пользовался.

А почему это называется «нити»?

— Представь, что все роботы разного цвета, и каждый робот помечает своим цветом все команды, которые он выполнил. Таким образом, за маленьким роботом, как за карандашом, будет тянуться след. Этот след тянется за роботом, как нитка за иголкой.

У каждого такого «маленького робота» есть задание, для исполнения которого его создали. И нить – это набор команд, выполненных в процессе исполнения этого задания.

Допустим, ты летишь на звездолете, чтобы доставить груз. Тогда «доставить груз» — это твое задание, ты в процессе его исполнения. А путь, который ты пролетел – это твоя нить. Можно сказать, что каждому новому заданию, каждой еще не решенной задаче соответствует своя нить – путь, который еще предстоит пройти.

— Другими словами, есть задание и «маленький робот», который его исполняет, а нить – это всего лишь взгляд на текущее положение дел со стороны?

— Именно так.

А вот как все это работает глубоко внутри. Т.к. процессор у компьютера один, то он может выполнять только одну команду одновременно. Поэтому происходит вот что: процессор постоянно переключается между нитями. Переключился на новую нить, выполнил несколько ее команд, затем переключился на следующую нить, выполнил несколько ее команд и так далее. Но т.к. переключение между нитями происходит сотни раз в секунду, со стороны кажется, что все нити работают одновременно.

Многопоточность или многонитевость - 1
Комментарии (381)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Maxim Terletsky Уровень 26
13 октября 2026
Наконец-то добрались до многопоточности. Всем удачи в прохождении этого сложного, но интересного испытания!
Euraks Уровень 33
17 октября 2026
сначала тоже резало слух слово нити, но потом понял что для понимания это норм. Так как поток тоже не очень подходит, есть же stream. Вообще лучше всего называть без перевода треды и стримы )
Maxim Terletsky Уровень 26
17 октября 2026
Всё равно слово «поток» привычнее. В этом случае, разумеется, лучше дополнять его фразой «поток выполнения». Треды и стримы тоже буду использовать так же, как и слово «вьюха» =)
Grigoryvvv Уровень 28 Expert
28 августа 2026
28.08.2026 / 26 уровень
Exaltyr777 Уровень 25
12 сентября 2025
"Попробуй представить программу, как такого маленького робота, который бегает по коду и выполняет команды. Сначала выполнил команду, написанную в одной строке, затем перешел на следующую, и так далее." Это же литерали я.
18 мая 2026
ХАХАХАХАХХАХА
Anonymous #3585174 Уровень 33
21 августа 2025
Like
9 апреля 2025
Есть подозрения, что если на собесе при обсуждении многопоточки сказать слово "нить", то он может очень быстро закончиться. Разумеется надо различать процессы и потоки, потоки ввода-вывода и потоки выполнения, но есть же общепринятые понятия (даже если они не точны), которые люди годами используют и очень хорошо друг друга понимают.
Victor Уровень 50
8 апреля 2025
Ответ на этот вопрос – нити(трэды) - отстойный перевод - из линейки "кульно" "кринжово" и т.п.
Денис Кокшаров Уровень 1
28 февраля 2025
не многонитивость, а многопоточность. благодаря вот этой вот путанице в этой статье пришлось пойти и убедиться в этом из нескольких источников, думаю сделано это всё целенаправленно
w5277c Уровень 32
16 декабря 2024
Вообще-то потоки - самое близкое определение для многопоточности И не было никаких проблем, пока теоретики не стали раздувать тему потоков ввода-вывода.
lom1tr Уровень 44
13 декабря 2024
А вот и сложная тема, всем удачи!
{Java_Shark} Уровень 36
10 октября 2024
Интересненько))) Всем добра и удачи в обучении)))++