JavaRush /Java блог /Random UA /Рівень 25. Відповіді на запитання до співбесіди на тему р...
zor07
31 рівень
Санкт-Петербург

Рівень 25. Відповіді на запитання до співбесіди на тему рівня

Стаття з групи Random UA
Рівень 25. Відповіді на запитання до співбесіди на тему рівня - 1
  1. Назвіть усі стани об'єкта Thread?

    • NEW
    • RUNNABLE
    • BLOCKED
    • WAITING
    • TIMED_WAITING
    • TERMINATED
  2. Які стани може перейти нитку, при вході в блок synchronized?

    • RUNNABLE
    • BLOCKED

    RUNNABLE, якщо блок коду, позначений synchronized, не зайнятий іншою ниткою. Інакше наша нитка отримає стан BLOCKED і чекатиме на звільнення об'єкта-мютексу.

  3. Який стан перейде нитку, при виклику методу wait()?

    Виклик цього методу переводить нитку у стан WAITING.
    Метод wait()можна викликати лише всередині блоку synchronizedу об'єкта-мютекса, який був «залочений (заблокований)» поточною ниткою, інакше метод викине виняток IllegalMonitorStateException .

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    При викликі методу wait(), поточна нитка знімає блокування з об'єкта monitor, і переходить у стан WAITING, чекаючи на виклик методу monitor.notify()або monitor.notifyAll()іншою ниткою. Як тільки це станеться, нитка прокинеться і якщо монітор не зайнятий, то захопить його і продовжить роботу.
    Якщо монітор виявиться зайнятий іншою ниткою, поточна нитка перейде у стан BLOCKED.

  4. Який стан перейде нитку, при виклику методу wait(500)?

    Виклик цього методу переводить нитку у стан TIMED_WAITING.
    За аналогією з методом 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.

  5. Який стан перейде нитку, при виклику методу notifyAll()?

    notifyAll()"пробудить" всі нитки. Одна з усіх "сплячих" (WAITING) ниток перейде в стан RUNNABLE, захопить монітор об'єкта, що використовується, і продовжить свою роботу. Інші виявляться в стані BLOCKED. Як тільки перша "прокинута" нитка відпустить монітор, на який всі інші очікують, її долю повторить наступна нитка (довільна нитка зі стану BLOCKED перейде в стан RUNNABLE). Це буде продовжуватися доти, доки всі "пробуджені" нитки не покинуть стану BLOCKED.

  6. Три нитки в блоці synchronized викликали wait()об'єкт-мютекс. Який стан перейдуть ці нитки, якщо четверта нитка викличе notifyAll()?

    Дві з них перейдуть у стан BLOCKED, одна у стан RUNNABLE

  7. Чим відрізняється join(500)від wait(500)?

    Незважаючи на те, що join(500)і wait(500)переведуть поточну нитку в стан TIMED_WAITING, між ними суттєві відмінності:
    join(500)викликається у нитки, wait(500)викликається всередині синхронізованого блоку об'єкта, по якому даний блок синхронізований.
    При виклику join(500)поточна нитка чекатиме 500 мілісекунд завершення нитки, метод якої join()був викликаний.
    При виклику wait(500)поточна нитка зніме блокування із синхронізованого об'єкта, і засинає на 500 мілісекунд.
    Через 500 мілісекунд в обох випадках нитки продовжать роботу.

  8. Чим відрізняється wait(500)від sleep(500)?

    sleep(500)викликається у нитки, wait(500)викликається всередині синхронізованого блоку об'єкта, яким даний блок синхронізований.
    При виклику sleep(500)поточна нитка чекатиме на 500 мілісекунд, потім продовжить свою роботу.
    При виклику wait(500)поточна нитка зніме блокування із синхронізованого об'єкта, і засинає на 500 мілісекунд.

  9. Який стан перейде нитку при виклику методу yield()?

    При виклику методу yield()– нитка «пропускає свій хід» і java відразу перемикається на виконання наступної нитки. Нитка зі стану runningперетворюється на стан ready. Стану running & ready – це стан стану RUNNABLE.

PS Коментарі, доповнення, виправлення, зауваження – вітаються =)
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ