— Привіт, Аміго!

А тепер трохи розповім про методи sleep, yield, join.

— Це нудно. Я знайшов питання до співбесіди «Чим відрізняються методи yield(), sleep(), wait()?». Може розкажеш?

— Не питання. Почну з того, що це три абсолютно різні методи.

1) sleep(timeout) - зупиняє поточну нитку (в якій sleep був викликаний) на timeout мілісекунд. Нитка при цьому переходить у стан TIMED_WAITING. Метод може завершитися раніше, якщо було встановлено прапорецьінтерrupted.

Приклад Опис
Thread.sleep(500);< /code>
Поточна нитка зупиняє свою роботу на 500 мілісекунд – 0.5 секунди.

2) yield() - поточна нитка «пропускає свій хід». Нитка зі стану running переходить у стан ready, а Java-машина приступає до виконання наступної нитки. Стан running & ready – це стан стану RUNNABLE.

Приклад Опис
Thread.yield();
Поточна нитка «пропускає свій хід» — Java одразу перемикається на виконання наступної нитки.

3) wait(timeout) – це одна з версій методу wait() – версія з таймаутом. Метод wait можна викликати тільки всередині блоку synchronized у об'єкта-мютексу, який був «залочений (заблокований)» поточною ниткою, інакше метод викине виняток IllegalMonitorState< /strong>Exception.

Внаслідок виклику цього методу, блокування з об'єкта-мютексу знімається, і він стає доступним для захоплення та блокування іншою ниткою. При цьому нитка переходить у стан WAITING для методу wait() без параметрів, але стан TIMED_WAITING для методу wait(timeout).

Приклад Опис
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
При викликі методу wait, поточна нитка знімає блокування з об'єкта monitor і засинає на 500 мілісекунд. Об'єкт monitor може бути захоплений іншою ниткою.
Через 500 мілісекунд нитка прокинеться і якщо monitor не був зайнятий, то захопить його і продовжить роботу.
Якщо монітор виявиться зайнятий іншою ниткою, поточна нитка перейде у стан BLOCKED.

4) join(timeout)

Цього методу не було у твоєму питанні, але він є в моїх планах, тож розповім і про нього. При виклику методу join() або join(timeout) поточна нитка як би «приєднується» до нитки, об'єкт якої був викликаний даний метод. Поточна нитка засинає і чекає на закінчення нитки, до якої вона приєдналася (чий метод join() був викликаний).

При цьому поточна нитка переходить у стан WAITING для методу join і стан TIMED_WAITING для методу join(timeout).

Приклад Опис
Thread thread = getWorkThread();
thread.join(500);
Поточна нитка приєднається до нитки thread і чекатиме її закінчення.
Але від'єднається через 500 мілісекунд і продовжить роботу.

timeout у методах wait(timeout) і join(timeout) означає, що метод засинає, чекає на щось, але не довше ніж timeout мілісекунд. Після чого прокидається.

— Таке відчуття, що єдине, що є спільного у цих методів, – це timeout. Але роблять вони абсолютно різні речі.

— Так воно і є.