Метод yield
Метод yield класса Thread является статическим методом
и не принимает параметров. Он вызывается у текущего потока и
служит подсказкой планировщику потоков о том, что поток готов
уступить свое процессорное время другим потокам с таким же
приоритетом. Важно понимать, что yield не гарантирует,
что поток действительно уступит процессор - планировщик может
проигнорировать эту подсказку и продолжить выполнение текущего
потока. Метод не выбрасывает проверяемых исключений и не
переводит поток в состояние ожидания, в отличие от методов
sleep или wait.
Синтаксис
Thread.yield()
Пример
Давайте создадим два потока, каждый из которых выводит числа
от 1 до 5, и после каждого вывода вызовем
yield, чтобы дать возможность другому потоку выполниться:
public class Main
{
public static void main(String[] args)
{
Thread first = new Thread(() -> {
for (int i = 1; i <= 5; i++)
{
System.out.println("first: " + i);
Thread.yield();
}
});
Thread second = new Thread(() -> {
for (int i = 1; i <= 5; i++)
{
System.out.println("second: " + i);
Thread.yield();
}
});
first.start();
second.start();
}
}
Возможный результат выполнения кода:
"first: 1"
"second: 1"
"first: 2"
"second: 2"
"first: 3"
"second: 3"
"first: 4"
"second: 4"
"first: 5"
"second: 5"
Пример
Давайте проверим, что yield не гарантирует передачу
процессора. Создадим поток, который вызывает yield
в цикле, и посмотрим, продолжит ли он выполняться:
public class Main
{
public static void main(String[] args) throws InterruptedException
{
Thread worker = new Thread(() -> {
for (int i = 1; i <= 3; i++)
{
System.out.println("worker: " + i);
Thread.yield();
}
});
worker.start();
worker.join();
System.out.println("done");
}
}
Результат выполнения кода:
"worker: 1"
"worker: 2"
"worker: 3"
"done"
Смотрите также
-
метод
sleep,
который приостанавливает поток на заданное время -
метод
join,
который ожидает завершения потока -
метод
currentThread,
который возвращает текущий поток -
метод
onSpinWait,
который подсказывает процессору занятое ожидание