Отличие yield и sleep

Thread.yield()Thread.sleep(...)
Назначениеподсказать планировщику уступить CPUне выполнять текущий поток минимум заданное время
Гарантия переключениянетпоток действительно не исполняется до истечения ожидания или interrupt
Состояниеостается RUNNABLETIMED_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? Нет.