— Привіт, Аміго!
А тепер трохи розповім про методи sleep, yield, join.
— Це нудно. Я знайшов питання до співбесіди «Чим відрізняються методи yield(), sleep(), wait()?». Може розкажеш?
— Не питання. Почну з того, що це три абсолютно різні методи.
1) sleep(timeout) - зупиняє поточну нитку (в якій sleep був викликаний) на timeout мілісекунд. Нитка при цьому переходить у стан TIMED_WAITING. Метод може завершитися раніше, якщо було встановлено прапорецьінтерrupted.
Приклад | Опис |
---|---|
|
Поточна нитка зупиняє свою роботу на 500 мілісекунд – 0.5 секунди. |
2) yield() - поточна нитка «пропускає свій хід». Нитка зі стану running переходить у стан ready, а Java-машина приступає до виконання наступної нитки. Стан running & ready – це стан стану RUNNABLE.
Приклад | Опис |
---|---|
|
Поточна нитка «пропускає свій хід» — Java одразу перемикається на виконання наступної нитки. |
3) wait(timeout) – це одна з версій методу wait() – версія з таймаутом. Метод wait можна викликати тільки всередині блоку synchronized у об'єкта-мютексу, який був «залочений (заблокований)» поточною ниткою, інакше метод викине виняток IllegalMonitorState< /strong>Exception.
Внаслідок виклику цього методу, блокування з об'єкта-мютексу знімається, і він стає доступним для захоплення та блокування іншою ниткою. При цьому нитка переходить у стан WAITING для методу wait() без параметрів, але стан TIMED_WAITING для методу wait(timeout).
Приклад | Опис |
---|---|
|
При викликі методу wait, поточна нитка знімає блокування з об'єкта monitor і засинає на 500 мілісекунд. Об'єкт monitor може бути захоплений іншою ниткою. Через 500 мілісекунд нитка прокинеться і якщо monitor не був зайнятий, то захопить його і продовжить роботу. Якщо монітор виявиться зайнятий іншою ниткою, поточна нитка перейде у стан BLOCKED. |
4) join(timeout)
Цього методу не було у твоєму питанні, але він є в моїх планах, тож розповім і про нього. При виклику методу join() або join(timeout) поточна нитка як би «приєднується» до нитки, об'єкт якої був викликаний даний метод. Поточна нитка засинає і чекає на закінчення нитки, до якої вона приєдналася (чий метод join() був викликаний).
При цьому поточна нитка переходить у стан WAITING для методу join і стан TIMED_WAITING для методу join(timeout).
Приклад | Опис |
---|---|
|
Поточна нитка приєднається до нитки thread і чекатиме її закінчення. Але від'єднається через 500 мілісекунд і продовжить роботу. |
timeout у методах wait(timeout) і join(timeout) означає, що метод засинає, чекає на щось, але не довше ніж timeout мілісекунд. Після чого прокидається.
— Таке відчуття, що єдине, що є спільного у цих методів, – це timeout. Але роблять вони абсолютно різні речі.
— Так воно і є.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ