Метод yield()

Метод yield()

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

Thread.yield() может быть полезным, когда поток ожидает наступления какого-то события, и необходимо, чтобы проверка его наступления происходила как можно чаще.


class RandomGenerator extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            MyMainClass.marker = (int) (Math.random() * 100);
        }
    }
}


class EventWaiter extends Thread {
    @Override
    public void run() {
        int local = 0;
        while ((local = MyMainClass.marker) % 7 != 0) {
            Thread.yield();
        }
        System.out.println("marker is " + local);
    }
}


public class MyMainClass {
    public static volatile int marker = 1;

    public static void main(String[] args) {

        Thread generator = new RandomGenerator();
        Thread waiter = new EventWaiter();

        generator.start();
        waiter.start();
    }
}
Возможные выводы:


/*
marker is 70

marker is 21

marker is 98
*/
Многопоточность