JavaRush/Курсы/Java Core/yield — пропуск хода

yield — пропуск хода

Открыта

— Привет, Амиго! У нас сегодня будет небольшой и интересный урок. Я расскажу тебе про yield – статический метод класса Thread.

Элли тебе уже рассказывала, что процессор постоянно переключается между нитями. Каждой нити выделяется небольшой кусочек процессорного времени, называемый квантом. Когда это время истекает – процессор переключается на другую нить и начинает выполнять ее команды. Вызов метода Thread.yield() позволяет досрочно завершить квант времени текущей нити или, другими словами, переключает процессор на следующую нить.

— А зачем нити может понадобиться уступить свое время другой нити?

— Необходимость в этом возникает не часто. Вызов yield приводит к тому, что «наша нить досрочно завершает ход», и что следующая за yield команда начнется с полного кванта времени. Значит шансы, что ее прервут – меньше. Особенно, если она небольшая (по времени). Такой подход можно использовать при оптимизации некоторых процессов.

Еще могу добавить, что метод Thread.sleep(0) работает фактически так же. Думаю, ты вначале будешь использовать метод yield не очень часто, но знать о нем — полезно.

Комментарии (145)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
TimJohnzz
Уровень 23
5 октября, 13:27
спасибо
Grigoryvvv
Уровень 28
Expert
24 сентября, 13:36
24.09.2026 / 27 уровень
Elisbeth
Уровень 30
24 июня, 09:14
Как только начала читать лекцию, сразу заподозрила, что нам подсовывают снова какой-то deprecated метод, и не ошиблась. А всё потому, что команда сайта забила вообще на этот курс и инфа лежит тут, пылится, уже хрен знает сколько лет. Вот вам актуальная инфа от ИИшки: Использование метода Thread.yield() в современном Java считается крайне неактуальным и практически не рекомендуется. Теперь давайте разберёмся, почему этот метод, который изначально задумывался как инструмент для вежливого сотрудничества между потоками, сегодня превратился в антипаттерн. Что делает Thread.yield()? Метод Thread.yield() является подсказкой планировщику потоков операционной системы. Его семантика такова: «Текущий поток выполнил достаточно работы и готов уступить процессорное время другому потоку с таким же приоритетом». Важно понимать: Это не гарантия. Планировщик ОС может проигнорировать эту подсказку. Он сам решает, какой поток запустить следующим, исходя из своих сложных алгоритмов. Почему это неактуально и опасно? Непредсказуемость. Поведение yield() сильно зависит от реализации JVM и операционной системы. Код, который работает на вашем компьютере, может вести себя совершенно иначе на сервере у клиента. Это делает отладку многопоточных проблем (гонки данных, взаимные блокировки) настоящим кошмаром. Ложное чувство контроля. Разработчик, использующий yield(), пытается вручную управлять планировщиком, что почти всегда является плохой идеей. Современные планировщики ОС и JVM гораздо умнее и эффективнее справляются с распределением ресурсов. Проблемы с производительностью. Вызов yield() может привести к частым переключениям контекста, что является дорогой операцией для процессора. Вместо повышения производительности это может её значительно снизить.
Elisbeth
Уровень 30
24 июня, 09:14
Что использовать вместо Thread.yield()? Для решения задач, которые разработчики иногда пытаются решить с помощью yield(), существуют гораздо более надежные и предсказуемые механизмы. Если нужно подождать, пока другой поток выполнит работу: Используйте механизмы синхронизации, которые специально для этого предназначены: wait() / notify() / notifyAll(): Классические методы для взаимодействия между потоками. Один поток wait()-ит (ждет), пока другой его не notify()-ет (разбудит). java.util.concurrent: Современный и предпочтительный пакет. CountDownLatch: Позволяет одному или нескольким потокам ждать, пока другие потоки не выполнят свои задачи. CyclicBarrier: Синхронизирует группу потоков, заставляя их ждать друг друга в общей точке (барьере). Thread.sleep(milliseconds): Этот метод гарантированно переводит поток в состояние ожидания на указанное время. Он делает именно то, что от него ожидают, и его поведение предсказуемо. Вывод: В современном Java-программировании метод Thread.yield() следует рассматривать как устаревший. Вместо него для координации потоков и управления параллелизмом следует использовать классы из пакета java.util.concurrent.
Сайфер
Уровень 51
9 июля, 10:31
Тянет на статью)
27 февраля, 11:18
И снова больше полу года ни одного комментария(
yarikk
Уровень 28
4 мая, 04:48
и вот опять
Anonymous #3585174
Уровень 33
27 августа 2025, 11:29
Like
XxelTaerg
Уровень 30
5 августа 2025, 11:12
ping
30 мая 2025, 18:29
А сколько людей сейчас, которые +- двигаются со мной в прохождении?
Zim4ik
Уровень 1
12 июня 2025, 09:13
Есть ) начал в апреле.
12 июня 2025, 09:49
🤜🤛
Vyacheslav
Уровень 30
Expert
14 мая 2025, 15:56
Чем дальше тем реже комментарии
DeepFryer
Уровень 36
1 июля 2025, 09:09
Даже грустно как-то хд I'm alone(
Lacer
Уровень 30
17 апреля 2025, 14:05
Есть кто живой?
Олег Сычев Java Developer
12 мая 2025, 20:52
есть)))
30 мая 2025, 18:28
Ау! Здесь кто-нибудь есть?)
Vulki
Уровень 53
25 сентября 2025, 06:30
+
{Java_Shark}
Уровень 36
30 октября 2024, 12:42
++
5 марта 2025, 10:30
++Java_Shark