Отличие yield и sleep
Thread.yield() | Thread.sleep(...) | |
|---|---|---|
| Назначение | подсказать планировщику уступить CPU | не выполнять текущий поток минимум заданное время |
| Гарантия переключения | нет | поток действительно не исполняется до истечения ожидания или interrupt |
| Состояние | остается RUNNABLE | TIMED_WAITING |
| Interrupt | не бросает исключение | бросает InterruptedException |
| Освобождает monitor/Lock | нет | нет |
sleep(100) не обещает пробуждение ровно через 100 мс. Это минимальная задержка: затем поток еще ждет планировщика. Для измерения прошедшего времени используют монотонный System.nanoTime(), а не предполагаемую точность сна.
yield() редко нужен прикладному коду: его результат зависит от платформы, поэтому он не подходит для очередности и ожидания условия. Busy-wait с yield() обычно заменяют очередью, Condition, CountDownLatch или LockSupport.
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}На собеседовании
- Освобождает ли
sleep()монитор? Нет;wait()освобождает монитор, на котором вызван. - Переводит ли
yield()поток в waiting? Нет. - Гарантирует ли
sleep(100)паузу ровно 100 мс? Нет, не меньше примерно заданного времени. - Можно ли через
yield()исправить race condition? Нет.