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

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

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

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

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

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

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

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

Комментарии (143)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Elisbeth Уровень 28
24 июня 2026
Как только начала читать лекцию, сразу заподозрила, что нам подсовывают снова какой-то deprecated метод, и не ошиблась. А всё потому, что команда сайта забила вообще на этот курс и инфа лежит тут, пылится, уже хрен знает сколько лет. Вот вам актуальная инфа от ИИшки: Использование метода Thread.yield() в современном Java считается крайне неактуальным и практически не рекомендуется. Теперь давайте разберёмся, почему этот метод, который изначально задумывался как инструмент для вежливого сотрудничества между потоками, сегодня превратился в антипаттерн. Что делает Thread.yield()? Метод Thread.yield() является подсказкой планировщику потоков операционной системы. Его семантика такова: «Текущий поток выполнил достаточно работы и готов уступить процессорное время другому потоку с таким же приоритетом». Важно понимать: Это не гарантия. Планировщик ОС может проигнорировать эту подсказку. Он сам решает, какой поток запустить следующим, исходя из своих сложных алгоритмов. Почему это неактуально и опасно? Непредсказуемость. Поведение yield() сильно зависит от реализации JVM и операционной системы. Код, который работает на вашем компьютере, может вести себя совершенно иначе на сервере у клиента. Это делает отладку многопоточных проблем (гонки данных, взаимные блокировки) настоящим кошмаром. Ложное чувство контроля. Разработчик, использующий yield(), пытается вручную управлять планировщиком, что почти всегда является плохой идеей. Современные планировщики ОС и JVM гораздо умнее и эффективнее справляются с распределением ресурсов. Проблемы с производительностью. Вызов yield() может привести к частым переключениям контекста, что является дорогой операцией для процессора. Вместо повышения производительности это может её значительно снизить.
Elisbeth Уровень 28
24 июня 2026
Что использовать вместо Thread.yield()? Для решения задач, которые разработчики иногда пытаются решить с помощью yield(), существуют гораздо более надежные и предсказуемые механизмы. Если нужно подождать, пока другой поток выполнит работу: Используйте механизмы синхронизации, которые специально для этого предназначены: wait() / notify() / notifyAll(): Классические методы для взаимодействия между потоками. Один поток wait()-ит (ждет), пока другой его не notify()-ет (разбудит). java.util.concurrent: Современный и предпочтительный пакет. CountDownLatch: Позволяет одному или нескольким потокам ждать, пока другие потоки не выполнят свои задачи. CyclicBarrier: Синхронизирует группу потоков, заставляя их ждать друг друга в общей точке (барьере). Thread.sleep(milliseconds): Этот метод гарантированно переводит поток в состояние ожидания на указанное время. Он делает именно то, что от него ожидают, и его поведение предсказуемо. Вывод: В современном Java-программировании метод Thread.yield() следует рассматривать как устаревший. Вместо него для координации потоков и управления параллелизмом следует использовать классы из пакета java.util.concurrent.
Сайфер Уровень 51
9 июля 2026
Тянет на статью)
27 февраля 2026
И снова больше полу года ни одного комментария(
yarikk Уровень 30
4 мая 2026
и вот опять
Anonymous #3585174 Уровень 33
27 августа 2025
Like
XxelTaerg Уровень 30
5 августа 2025
ping
30 мая 2025
А сколько людей сейчас, которые +- двигаются со мной в прохождении?
Zim4ik Уровень 1
12 июня 2025
Есть ) начал в апреле.
12 июня 2025
🤜🤛
Vyacheslav Уровень 30 Expert
14 мая 2025
Чем дальше тем реже комментарии
DeepFryer Уровень 36
1 июля 2025
Даже грустно как-то хд I'm alone(
Lacer Уровень 30
17 апреля 2025
Есть кто живой?
Олег Сычев Уровень 9
12 мая 2025
есть)))
30 мая 2025
Ау! Здесь кто-нибудь есть?)
Vulki Уровень 53
25 сентября 2025
+
{Java_Shark} Уровень 36
30 октября 2024
++
Денис Кокшаров Уровень 1
5 марта 2025
++Java_Shark
Philipp Vasichev Уровень 28
11 октября 2024
🤫
Cвят Уровень 29
16 июня 2024
Представим пример с кабинками голосования и мьютексом, вот стоит 10 человек и 5 кабинок для голосования, тогда каждый человек это поток который заходит в объект блокирует мьютекс и выполняет код метода объекта: достает листок заполняет и засовывает в урну Ситуация с Thread.yield(): 1. Человек 1 заходит в очередь для голосования, но понимает что он старый дед и его код метода слишком длинный 2. Человек 1 решает временно уступить своё место для увеличения производительности очереди (вызывает Thread.yield()) 3. Человек 2, который тоже стоит в очереди, видит, что Человек 1 уступил место, и заходит в кабину для голосования. Польза: Дед не тормозит работу голосования иногда забегая делая часть кода и снова уступая. при этом он продолжает с того же места где закончил. При этом yield не нужен если все потоки делают одну задачу с одинаковым временем и приоритетом)
Абзал Уровень 38
20 июля 2024
Классный пример =)
Wren Уровень 29
27 августа 2024
О, хороший пример. Спасибо.