-
Назвіть усі стани об'єкта
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.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ