— Привет, Амиго!
А теперь немного расскажу про методы sleep, yield, join.
— Это скучно. Я тут нашел вопрос к собеседованию «Чем отличаются методы yield(), sleep(), wait()?». Может расскажешь?
— Не вопрос. Начну с того, что это три совершенно разных метода.
1) sleep(timeout) – останавливает текущую нить (в которой sleep был вызван) на timeout миллисекунд. Нить при этом переходит в состояние TIMED_WAITING. Метод может завершиться раньше, если был установлен флаг isInterrupted.
Пример | Описание |
---|---|
|
Текущая нить приостанавливает свою работу на 500 миллисекунд – 0.5 секунды. |
2) yield() – текущая нить «пропускает свой ход». Нить из состояния running переходит в состояние ready, а Java-машина приступает к выполнению следующей нити. Состояния running & ready – это подсостояния состояния RUNNABLE.
Пример | Описание |
---|---|
|
Текущая нить «пропускает свой ход» — Java сразу переключается на выполнение следующей нити. |
3) wait(timeout) – это одна из версий метода wait() – версия с таймаутом. Метод wait можно вызвать только внутри блока synchronized у объекта-мютекса, который был «залочен (заблокирован)» текущей нитью, в противном случае метод выкинет исключение IllegalMonitorStateException.
В результате вызова этого метода, блокировка с объекта-мютекса снимается, и он становится доступен для захвата и блокировки другой нитью. При этом нить переходит в состояние 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. Но делают они совершенно разные вещи.
— Так оно и есть.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ