JavaRush /Курсы /Java Multithreading /Подготовка к собеседованию 5 уровень

Подготовка к собеседованию 5 уровень

Java Multithreading
5 уровень , 15 лекция
Открыта

— Привет, Амиго!

  Вопросы к собеседованиям
1 Назовите все состояния объекта Thread?
2 В какие состояния может перейти нить при входе в блок synchronized?
3 В какое состояние перейдет нить при вызове метода wait()?
4 В какое состояние перейдет нить при вызове метода wait(500)?
5 В какое состояние перейдет нить при вызове метода notify()?
6 В какое состояние перейдет нить при вызове метода notifyAll()?
7 Три нити в блоке synchronized вызвали wait() у объекта-мютекса.
В какое состояние перейдут эти нити, если четвертая нить вызовет notifyAll()?
8 Чем отличается join(500) от wait(500)?
9 Чем отличается wait(500) от sleep(500)?
10 В какое состояние перейдет нить при вызове метода yield()?

 

Комментарии (26)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Lisa Уровень 53
29 августа 2025
### 1. Назовите все состояния объекта Thread? Жизненный цикл нити (трэда) - NEW — поток создан, но не запущен (создан объект Thread, метод start() не вызван). - RUNNABLE — поток запущен и готов к выполнению, либо выполняется (включает "ready-to-run" и "running"). - BLOCKED — поток пытается войти в synchronized-блок или метод, но ожидает освобождения монитора (мьютекса). - WAITING — поток ожидает бесконечно, пока другой поток не разбудит (например, после вызова wait(), join()). - TIMED_WAITING — поток ожидает определённое время (sleep(time), wait(time), join(time)). - TERMINATED — поток завершил работу. ### 2. В какие состояния может перейти нить при входе в блок synchronized? Поток может перейти в состояние BLOCKED, если монитор (мьютекс) заблокирован другим потоком. ### 3. В какое состояние перейдет нить при вызове метода wait()? WAITING ### 4. В какое состояние перейдет нить при вызове метода wait(500)? TIMED_WAITING ### 5. В какое состояние перейдет нить при вызове метода notify()? ### 6. В какое состояние перейдет нить при вызове метода notifyAll()? При вызове notify() или notifyAll() потоки, ожидавшие на объекте, переходят из WAITING или TIMED_WAITING в BLOCKED, так как им нужно занять монитор перед продолжением. ### 7. Три нити в блоке synchronized вызвали wait() у объекта-мютекса. В какое состояние перейдут эти нити, если четвертая нить вызовет notifyAll()? Все три потока перейдут в состояние BLOCKED— они борются за занятость монитора.
Lisa Уровень 53
29 августа 2025
### 8. Чем отличается join(500) от wait(500)? - join(500) — текущий поток ждёт максимум 500 мс завершения другого потока. Поток переходит в WAITING (без таймаута) или TIMED_WAITING (с таймаутом). После join поток продолжает работу либо после завершения другого потока, либо после таймаута. - wait(500) — текущий поток освобождает монитор и ждёт уведомления или истечения 500 мс, после чего пытается занять монитор. Если монитор занят, поток ждёт в BLOCKED. ### 9. Чем отличается wait(500) от sleep(500)? - sleep(500) — поток просто "спит", блокировка монитора остаётся, он не освобождает блокировки. - wait(500) — поток освобождает монитор и ждёт уведомления или таймаута, монитор доступен другим потокам. ### 10. В какое состояние перейдет нить при вызове метода yield()? При вызове yield() текущий поток из состояния RUNNING переходит в READY (внутреннее состояние RUNNABLE), давая шанс другим потокам выполнить работу.
Дарья Уровень 1
5 апреля 2023
Ребята, кто понял, обьясните пожалуйста ответ на 7ой вопрос! Что и как там происходит?🙂🙂
Griboed Уровень 30
9 апреля 2023
и метод wait() и метод notify() и метод notifyAll() могут вызываться нитями только тогда, когда нить, вызывающая такой метод, находится в synchronized блоке. В один момент времени может существовать одна не-waiting и не-blocked нить в блоке кода, синхронизированном по одному объекту (то есть, находящаяся в synchronized блоке, бодрствующая и в состоянии Runnable). поскольку только работающая нить может в synchronized блоке делать всякое, то при вызове метода notifyAll() она все еще находится в таком блоке. Все нити, которые до этого пребывали в состоянии WAITING(выполняя метод wait()) перестают ожидать (всех их уведомили), но при этом становятся заблокированы (BLOCKED) по той причине, что в методе все еще пребывает четвертая нить, которая непосредственно уведомила первые три вызовом метода notifyAll(). И только лишь после того, как эта четвертая нить выйдет из synchronized блока или метода, каждая из первых трех нитей по очереди начнет менять свой статус на RUNNABLE и выполнять свой код, идущий после метода wait(), в котором она ожидала. И после покидания synchronized блока первой нитью (одной из трех, что изначально были WAITING), этим же займется вторая нить. Потом третья.
Long_byte Уровень 55
8 июня 2024
все 3 нити перейдет из состояние waiting в blocked пока 4 нить не покинет блок синхронайзд так как 4 нить захватил монитор обьекта как только 4 нить покинет блок синхронайзд один из нитей захватит монитор обьекта и перейдет в состояние runnable осталные 2 нити будет в состоянии blocked
Mudril Уровень 28
23 февраля 2023
>7. Три нити в блоке synchronized вызвали wait() у объекта-мютекса. В какое состояние перейдут эти нити, если четвертая нить вызовет notifyAll()? Есть важный момент, четвертая нить методом notify, notifyAll только переведет все нити в Runnable. До конца своего блока synchronized, четвертая нить будет единственным обладателем мютекста, а значит, что вероятно все 3 нити отправятся в Blocked, пока четвертая не закончит работу.
Михаил Уровень 32
16 ноября 2022
На мой взгляд гуглить, чтобы прочитать по заданию JR это все равно, что воображаемо насиловать до смерти хомяка золовки умершего одноклассника, а потом мучиться стыдом и плакать, что не сдержался. Учить вопросы к собеседованию имеет смысл только если решил всех обмануть и хитростью захватить монитор эйчарши extends техспеца, оценивающего твою адекватность. А потом они поймут, что ты самозванец по твоим вопросам и предлагаемым решениям, но уже будет поздно. Второго такого же они не вынесут. Так и останутся в состоянии TIMED_WAITING. Гугление при решении реальной задачи приводит к мгновенному усвоению хода-подвыверта и глобально - к усвоению философии целой темы. А там уже и хочется узнать - что по этому поводу думал Блох! Типа - никогда никогда никогда не используйте константы вместо перечислений.
Alexey Svorkin Уровень 37
8 июля 2022
Месяц не учился и все забыл !
Ra Уровень 35 Student
20 июня 2023
Аналогично. Надо повторить курс через год)
CyberBoar Уровень 1
15 июня 2022
Теорию уже практически перестали давать, просто пишут что надо гуглить. С одной стороны. это раздражает. С другой стороны, это правильно. Вся теория уже давно отлично описана в книгах и официальной документации. Лучше, чем написано там, уже не будет.
Lafaed Уровень 36
7 апреля 2023
А третья сторона вас не посещала ? Которая гласит - ты же заплатил, так что иди учись, где хочешь и как хочешь - ты же самообучаемый и должен уметь гуглить.
20 апреля 2022
Ура! Первый блок вопросов на который получилось дать все правильные ответы!)
Максим Уровень 41
21 марта 2021

Три нити в блоке synchronized вызвали wait() у объекта-мютекса.
В какое состояние перейдут эти нити, если четвертая нить вызовет notifyAll()?
Почему в ответах пишут, что:

Две из них перейдут в состояние Blocked, одна в состояние Runnable.
Как вообще больше одной нити может попасть в блок synchronized? Такого же не может быть, или я что-то путаю?
Darth Nihilus Уровень 35
17 мая 2021
сам не профессор, но думаю, блок synchronized освободился, нить зашла и вызвала wait (и так поступили 3 нити), 4-ая вызывает их обратно методом notifyAll, и какая-то из нитей зайдет и начнет работу, а остальные будут в очереди, то есть заблокированы. Я понимаю это так, что какой-то код до момента wait мог быть исполнен, и что нить продолжит работу после строчки с wait
Yarik Уровень 44
14 декабря 2021
Попасть то могут, попадают видят что она залочена и ждут, а та которая успела на открытый мьютекс работает себе.
Lafaed Уровень 36
7 апреля 2023

Думаю для общей картины стоит отметить что 4я нить 
которая вызывала notifyAll, 
в данный момент TERMINATED, 
ну если конечно не ожидает завершения прочих нитей и пр. нюансы.

Одна из "проснувшихся" нитей захватывет synchronized 
и блокирует мютекс, переходит в режим Runnable.

Оставшиеся нити упираются в Blocked.
Дмитрий Уровень 41
23 декабря 2020
Вопросы к Собеседованию (Ответы) - Часть 1 1. Назовите все состояния объекта Thread?

public enum State {
 NEW,
 RUNNABLE,
 BLOCKED,
 WAITING,
 TIMED_WAITING,
 TERMINATED;
}
2. В какие состояния может перейти нить, при входе в блок synchronized? Нить подошла к блоку кода, помеченному synchronized, и если он свободен, тогда наша нить получит состояние Runnable. Нить подошла к блоку кода, помеченному synchronized, а он занят другой нитью. Тогда наша нить получит состояние Blocked и будет ждать освобождения объекта-мютекса. 3. В какое состояние перейдет нить, при вызове метода wait()? При вызове метода wait() нить переходит в состояние Waiting. 4. В какое состояние перейдет нить, при вызове метода wait(500)? При вызове метода wait(500) нить переходит в состояние Timed Waiting. 5. В какое состояние перейдет нить, при вызове метода notify()? При вызове метода notify() нить переходит в состояние Runnable.
Дмитрий Уровень 41
23 декабря 2020
Вопросы к Собеседованию (Ответы) - Часть 2 6. В какое состояние перейдет нить, при вызове метода notifyAll()? При вызове метода notifyAll() нить переходит в состояние Runnable. 7. Три нити в блоке synchronized вызвали wait() у объекта-мютекса. В какое состояние перейдут эти нити, если четвертая нить вызовет notifyAll()? Две из них перейдут в состояние Blocked, одна в состояние Runnable. 8. Чем отличается join(500) от wait(500)? При вызове join(500) текущая нить будет ожидать 500 миллисекунд завершения нити, чей метод join() был вызван. При вызове wait(500) текущая нить снимет блокировку с синхронизированного объекта, и засыпает на 500 миллисекунд. 9. Чем отличается wait(500) от sleep(500)? При вызове sleep(500) текущая нить будет ожидать 500 милисекунд, затем продолжит свою работу. При вызове wait(500) текущая нить снимет блокировку с синхронизированного объекта, и засыпает на 500 миллисекунд. 10. В какое состояние перейдет нить при вызове метода yield()? yield() – текущая нить «пропускает свой ход». Нить из состояния Running переходит в состояние Ready, а Java-машина приступает к выполнению следующей нити. Состояния Running & Ready – это подсостояния состояния Runnable.
Flexo Уровень 41
28 мая 2021

5. В какое состояние перейдет нить, при вызове метода notify()
>При вызове метода notify() нить переходит в состояние Runnable.
если монитор занят, то blocked
Griboed Уровень 30
19 марта 2023

Три нити в блоке synchronized вызвали wait()
 у объекта-мютекса. В какое состояние перейдут
 эти нити, если четвертая нить вызовет notifyAll()?
Все три Waiting нити перейдут в Blocked состояние. Нить, вызвавшая метод notifyAll, никуда из synchronized-блока не вылетела, а дальше продолжила выполнение кода. Соответственно, никакая из трех нитей в состояние Runnable не перейдет до тех пор, пока четвертая Runnable нить не покинет synchronized блок, или сама .не вызовет метод wait.
Хорс Уровень 41
11 апреля 2020
йу-хуууу, ответил сам без гугления!