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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

— Именно так.

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

Многопоточность или многонитевость - 1
Комментарии (381)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Exaltyr777 Уровень 25
12 сентября 2025
"Попробуй представить программу, как такого маленького робота, который бегает по коду и выполняет команды. Сначала выполнил команду, написанную в одной строке, затем перешел на следующую, и так далее." Это же литерали я.
Anonymous #3585174 Уровень 33
21 августа 2025
Like
9 апреля 2025
Есть подозрения, что если на собесе при обсуждении многопоточки сказать слово "нить", то он может очень быстро закончиться. Разумеется надо различать процессы и потоки, потоки ввода-вывода и потоки выполнения, но есть же общепринятые понятия (даже если они не точны), которые люди годами используют и очень хорошо друг друга понимают.
Victor Уровень 36
8 апреля 2025
Ответ на этот вопрос – нити(трэды) - отстойный перевод - из линейки "кульно" "кринжово" и т.п.
Денис Кокшаров Уровень 32
28 февраля 2025
не многонитивость, а многопоточность. благодаря вот этой вот путанице в этой статье пришлось пойти и убедиться в этом из нескольких источников, думаю сделано это всё целенаправленно
w5277c Уровень 32
16 декабря 2024
Вообще-то потоки - самое близкое определение для многопоточности И не было никаких проблем, пока теоретики не стали раздувать тему потоков ввода-вывода.
lom1tr Уровень 44
13 декабря 2024
А вот и сложная тема, всем удачи!
{Java_Shark} Уровень 36
10 октября 2024
Интересненько))) Всем добра и удачи в обучении)))++
Алексей Уровень 7
7 октября 2024
наконец-то нити!😊
Sergey Klokov Уровень 30
30 августа 2024
Пока ничего не понятно, но очень интересно. Процессор один и выполняет только одну команду, здесь кол-во ядер разве не влияет на кол-во одновременных команд?
Duxa552 Уровень 1
6 сентября 2024
влияет. 2 ядра - 2 одновременных потока и т.д. у каждого ядра свои нити
ВК Уровень 36
8 декабря 2024
Всё несколько сложнее и вряд ли будет объяснено на этих курсах. Тредов может быть намного больше чем ядер процессора и многозадачность отчасти эмулируется операционной системой, очень быстро переключаясь между задачами (выделяя каждой примерно по 8 мс на квант времени), а отчасти - самим процессором за счёт таких сложных техник, которые я на пальцах не объясню (что-то про конвеерную обработку кода, предсказания команд, оценку того с какой памятью будут работать следующие команды и подобная магия).