yield

Модуль 2. Java Core
12 уровень , 3 лекция
Открыта

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

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

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

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

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

Комментарии (12)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Руслан Уровень 46
13 октября 2025
Отличие yield от sleep в том что yield просто говорит планировщику что он просто готов досрочно завершить операцию и отдать квант времени но это не приказ планировщику а просто рекомендация а sleep это реально приказ который говорит все я погнал спать дальше сам🤣🤣
Руслан Никитин Уровень 109
17 сентября 2024
Краткость - сестра таланта 😁
Тимур Уровень 109
13 сентября 2024
Ясно.
Олег Уровень 106 Expert
15 июля 2024
Так в пред. лекциях писали, что нить не может досрочно завершиться ._.
Егор Степанов Уровень 111
31 октября 2024
Нить не завершается досрочно, а просто уступает свою очередь. Пример: Два человека у кассы. Покупатель1 (с целой тележкой продуктов) пропускает вперед Покупателя2, у которого в руках только бутылка воды. Покупатель1 не ушел из магазина, а просто пропустил вперед другого.
Серафим Уровень 109
23 января 2024
Пример кода на Java, иллюстрирующий использование метода Thread.yield():

public class YieldExample {

    public static void main(String[] args) {
        // Создаем две нити
        Thread thread1 = new MyThread("Нить 1");
        Thread thread2 = new MyThread("Нить 2");

        // Запускаем нити
        thread1.start();
        thread2.start();
    }

    static class MyThread extends Thread {

        public MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(getName() + ": Шаг " + i);

                // Вызываем Thread.yield(), чтобы дать другой нити возможность выполниться
                Thread.yield();

                // Можно добавить условие для вызова Thread.sleep(0) по тем же причинам
                // if (i % 2 == 0) {
                //     try {
                //         Thread.sleep(0);
                //     } catch (InterruptedException e) {
                //         e.printStackTrace();
                //     }
                // }
            }
        }
    }
}

В этом примере создается две нити (Нить 1 и Нить 2), которые выполняют некоторую работу в цикле. Внутри цикла каждая нить вызывает Thread.yield(), что позволяет процессору переключиться на другую нить. Таким образом, нити могут "уступать" друг другу свое время выполнения.
Дмитрий Уровень 1 Expert
1 июля 2023

public class YieldExample {
    public static void main(String[] args) {
        // Создаем два потока
        Thread thread1 = new Thread(new MyRunnable(), "Thread 1");
        Thread thread2 = new Thread(new MyRunnable(), "Thread 2");

        // Запускаем потоки
        thread1.start();
        thread2.start();
    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + " - " + i);

            // При каждой итерации цикла вызываем метод Thread.yield()
            Thread.yield();
        }
    }
}

Thread 1 - 0
Thread 2 - 0
Thread 1 - 1
Thread 2 - 1
Thread 1 - 2
Thread 2 - 2
Thread 1 - 3
Thread 2 - 3
Thread 1 - 4
Thread 2 - 4
Руслан Уровень 111 Expert
19 июня 2023
Лекция должна стоить 1 материю ) Ютубчик в помощь
Виктор Уровень 111 Expert
26 апреля 2023
Есть yield о нем надо знать на этом все зачем так много текста))))
Alexander Уровень 81 Expert
13 октября 2022
Больше заинтриговали...
Евгений Уровень 90
12 сентября 2022
И чем же yield отличается от sleep? И в каких случаях что нужно использовать? Автор буквы экономил?