Бесплатный курс по Java: от основ до продвинутого уровня
Метод yield в Java
Когда поток вызывает метод yield он говорит: мне сейчас не обязательно заканчивать свою работу и занимать время процессора и больше времени передастся другим потокам
Пример программы:
class YieldExample {
public static void main(String[] args) {
new SomeThread().start();
new SomeThread().start();
new SomeThread().start();
}
}
class SomeThread extends Thread {
public void run() {
System.out.println(Thread.currentThread().getName()
+ ” уступает свое место другим потокам”);
Thread.yield();
System.out.println(Thread.currentThread().getName()
+ ” завершился”);
}
}
Вывод:
Мы запускаем три потока. Планировщик потоков может запустить эти потоки в разном порядке (например, 2-1-0 или 1-0-2)
Рассмотрим порядок 0-1-2.
Первым запускается 0 поток и с помощью yield он уступает время работы процессора другим потокам, то есть потоку 1 и потоку 2.
Вторым до yield доходит поток 1. Он уступает другим, то есть оставшемуся 2. Поток 2 доходит до yield последним и хочет уступить другим но уступать уже некому
Если больше нет потоков, которым можно уступить место для выполнения, то уступается место для выполнения последнему уступившему перед потоком 2 то есть потоку 1.
Далее последнему уступившему перед 1, то есть 0 и потом 2.
На консоли мы видим именно такую последовательность выполнения.
Semaphore в Java: контроль доступа потоков к ресурсам. Как ограничить число одновременных операций и управлять очередью. Рабочий пример с кодом.
Time to read: 10
ReentrantLock - гибкая альтернатива synchronized
ReentrantLock в Java: мощная альтернатива synchronized с гибкой блокировкой любых участков кода. Примеры, отличия и преимущества для многопоточности.
Time to read: 11
Ожидание завершения потоков с помощью CountDownLatch
CountDownLatch в Java: механизм ожидания завершения потоков. Как использовать await() и countDown() для синхронизации. Практический пример и разбор работы.