Назовите все состояния объекта
Thread
?- NEW
- RUNNABLE
- BLOCKED
- WAITING
- TIMED_WAITING
- TERMINATED
В какие состояния может перейти нить, при входе в блок
synchronized
?- RUNNABLE
- BLOCKED
В RUNNABLE, если блок кода, помеченный
synchronized
, не занят другой нитью. Иначе наша нить получит состояние BLOCKED и будет ждать освобождения объекта-мютекса.- В какое состояние перейдет нить, при вызове метода
wait()
?Вызов этого метода переводит нить в состояние WAITING.
Методwait()
можно вызвать только внутри блокаsynchronized
у объекта-мютекса, который был «залочен (заблокирован)» текущей нитью, в противном случае метод выкинет исключение IllegalMonitorStateException.
Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
При вызове методаwait()
, текущая нить снимает блокировку с объектаmonitor
, и переходит в состояние WAITING, ожидая вызова методаmonitor.notify()
илиmonitor.notifyAll()
другой нитью. Как только это произойдет, нить проснется и если монитор не был занят, то захватит его и продолжит работу.
Если монитор окажется занят другой нитью, текущая нить перейдет в состояние BLOCKED. В какое состояние перейдет нить, при вызове метода
Вызов этого метода переводит нить в состояние TIMED_WAITING.wait(500)
?
По аналогии с методомwait()
,wait(timeout)
можно вызвать только внутри блокаsynchronized
у объекта-мютекса, который был «залочен (заблокирован)» текущей нитью.Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
При вызове метода
wait()
, текущая нить снимает блокировку с объектаmonitor
, и засыпает на 500 миллисекунд. Объектmonitor
может быть захвачен другой нитью.
Через 500 миллисекунд нить проснется и еслиmonitor
не был занят, то захватит его и продолжит работу.
Если монитор окажется занят другой нитью, текущая нить перейдет в состояние BLOCKED.В какое состояние перейдет нить, при вызове метода
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
Послеmonitor.wait()
, нить перейдет в состояние WAITING. Методnotify()
, вызванный другой нитью у объектаmonitor
переведет нить из состояния WAITING в состояние RUNNABLE, если объект monitor не будет захвачен другой нитью, иначе в состояние BLOCKED.В какое состояние перейдет нить, при вызове метода
notifyAll()
?notifyAll()
"пробудет" все нити. Одна из всех "спящих" (WAITING) нитей перейдет в состояние RUNNABLE, захватит монитор используемого объекта и продолжит свою работу. Остальные окажутся в состоянии BLOCKED. Как только первая "проснувшаяся" нить отпустит монитор, который все остальные ожидают, её участь повторит следующая нить (произвольная нить из состояния BLOCKED перейдет в состояние RUNNABLE). Это будет продолжаться до тех пор, пока все "пробужденные" нити не покинут состояния BLOCKED.Три нити в блоке synchronized вызвали
Две из них перейдут в состояние BLOCKED, одна в состояние RUNNABLEwait()
у объекта-мютекса. В какое состояние перейдут эти нити, если четвертая нить вызоветnotifyAll()
?Чем отличается
Несмотря на то, что иjoin(500)
отwait(500)
?join(500)
иwait(500)
переведут текущую нить в состояние TIMED_WAITING, между ними существенные различия:
join(500)
вызывается у нити,wait(500)
вызывается внутри синхронизированного блока у объекта, по которому данный блок синхронизирован.
При вызовеjoin(500)
текущая нить будет ожидать 500 миллисекунд завершения нити, чей методjoin()
был вызван.
При вызовеwait(500)
текущая нить снимет блокировку с синхронизированного объекта, и засыпает на 500 миллисекунд.
Через 500 миллисекунд в обоих случаях нити продолжат работу.Чем отличается
wait(500)
отsleep(500)
?sleep(500)
вызывается у нити,wait(500)
вызывается внутри синхронизированного блока у объекта, по которому данный блок синхронизирован.
При вызовеsleep(500)
текущая нить будет ожидать 500 милисекунд, затем продолжит свою работу.
При вызовеwait(500)
текущая нить снимет блокировку с синхронизированного объекта, и засыпает на 500 миллисекунд.В какое состояние перейдет нить при вызове метода
При вызове методаyield()
?yield()
– текущая нить «пропускает свой ход» и java сразу переключается на выполнение следующей нити. Нить из состоянияrunning
переходит в состояниеready
. Состояния running & ready – это подсостояния состояния RUNNABLE.
JavaRush
/Java блог
/Архив info.javarush
/Уровень 25. Ответы на вопросы к собеседованию по теме уро...
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ