yield

Открыта

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

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

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

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

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

Комментарии (13)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Руслан
Уровень 48
13 октября 2025, 07:13
Отличие yield от sleep в том что yield просто говорит планировщику что он просто готов досрочно завершить операцию и отдать квант времени но это не приказ планировщику а просто рекомендация а sleep это реально приказ который говорит все я погнал спать дальше сам🤣🤣
17 сентября 2024, 06:31
Краткость - сестра таланта 😁
Тимур
Уровень 109
13 сентября 2024, 17:49
Ясно.
Олег
Уровень 106
Expert
15 июля 2024, 19:07
Так в пред. лекциях писали, что нить не может досрочно завершиться ._.
Егор СтепановРаботает в АйЭмТи
31 октября 2024, 19:13
Нить не завершается досрочно, а просто уступает свою очередь. Пример: Два человека у кассы. Покупатель1 (с целой тележкой продуктов) пропускает вперед Покупателя2, у которого в руках только бутылка воды. Покупатель1 не ушел из магазина, а просто пропустил вперед другого.
Underdante
Уровень 51
19 мая, 16:45
не много не так. покупатель 1 начинает пробивать свои продукты , а потом как бы говорит кассиру -- хватит , и кассир может решить , начать пробивать покупки у другого покупателя или же продолжить пробивать у этого же. Не стоит забывать что наш продавец пробивает по несколько покупок у каждого покупателя, бегая между ними. yield как бы говорит процессору - переключись на другую нить, но процессор может переключится на эту же нить.
СерафимBackend Developer в Rapira
23 января 2024, 08:51
Пример кода на 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(), что позволяет процессору переключиться на другую нить. Таким образом, нити могут "уступать" друг другу свое время выполнения.
Дмитрий Backend Developer Expert
1 июля 2023, 18:55
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
Руслан
Уровень 114
Expert
19 июня 2023, 22:02
Лекция должна стоить 1 материю ) Ютубчик в помощь
Виктор
Уровень 111
Expert
26 апреля 2023, 18:31
Есть yield о нем надо знать на этом все зачем так много текста))))
AlexanderРаботает в СканпортExpert
13 октября 2022, 11:45
Больше заинтриговали...
Евгений Frontend Developer
12 сентября 2022, 05:42
И чем же yield отличается от sleep? И в каких случаях что нужно использовать? Автор буквы экономил?