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