webprogr.ru Новости

RSS

{{toodo.preview}}

...
{{toodo.name}}

{{toodo.preview}}

далее..

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

смотреть..

toodo.name

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

перейти...

{{toodo.preview}}

...
{{toodo.name}}

{{toodo.preview}}

далее..

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

смотреть..

toodo.name

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

перейти...


Последние новости

Жизненный цикл потока

В Java поток проходит через ряд состояний:

NEW – поток создан, но еще не запущен (метод start() не вызывался).

RUNNABLE – поток готов к выполнению или выполняется (выполняется на CPU или ожидает квант времени).

BLOCKED – поток заблокирован, ожидает освобождения мониторa (вошел в синхронизированный блок, но монитор занят другим потоком).

WAITING – поток находится в ожидании бессрочно (методы Object.wait(), Thread.join() без таймаута или LockSupport.park() поместили поток в ожидание действия другого потока).

TIMED_WAITING – поток ожидает с таймаутом (вызваны Thread.sleep(), Object.wait(timeout), Thread.join(timeout) или аналогичные методы с указанием времени ожидания).

TERMINATED – поток завершил выполнение (нормально выполнил run() или завершился с необработанным исключением).

Метод getState() возвращает текущее состояние потока. После перехода в TERMINATED поток нельзя запустить заново.

Пояснение:
Каждый поток в Java при своей работе последовательно проходит ряд состояний. Когда вы лишь создали новый Thread t = new Thread(...), но не стартовали его, поток находится в состоянии NEW («новый»). После вызова t.start() поток регистрируется у планировщика JVM и переходит в состояние RUNNABLE. Здесь нужно учитывать особенность: в JVM состояние RUNNABLE охватывает сразу две ситуации – поток либо реально выполняется на одном из процессоров, либо готов к выполнению, но сейчас временно не получает CPU (например, если все ядра заняты другими потоками). В обоих случаях метод getState() вернет RUNNABLEdocs.oracle.comdocs.oracle.com. Отдельного состояния «Running» в Java нет – активный и готовый потоки не различаются на уровне языка.
 
Если поток пытается войти в синхронизированную критическую секцию, уже занятую другим потоком, он переходит во BLOCKED – это означает, что поток заблокирован в ожидании освобождения монитора (блокировки) нужного объектаdocs.oracle.com. Как только монитор освобождается, заблокированный поток автоматически возобновляется и возвращается в RUNNABLE (готов к выполнению).
 
Состояния WAITING и TIMED_WAITING связаны с тем, что поток добровольно приостанавливает свое выполнение, ожидая наступления определенного события или истечения времени. WAITING наступает, когда поток вызывает, например, obj.wait() без таймаута или thread.join() без таймаута – т.е. он «засыпает» и будет пробужден только явным сигналом от другого потокаdocs.oracle.comdocs.oracle.com. В WAITING поток остается бессрочно, пока не получит уведомление (или пока не будет прерван). TIMED_WAITING похож на WAITING, но используется когда задан ограниченный период ожидания – например, Thread.sleep(500) переводит поток в TIMED_WAITING на ~500 миллисекунд, после чего JVM сама пробудит поток по истечении времениdocs.oracle.com. Также TIMED_WAITING возникает при вызове wait(timeout) или попытке присоединиться к потоку с таймаутом (join(timeout)).
 
Наконец, при завершении метода run() поток переходит в состояние TERMINATED (terminated, или иногда говорят "Dead" – мертвый)docs.oracle.com. Это конечное состояние: поток окончательно прекратил работу. Завершение может произойти либо естественным образом (метод run завершил исполнение до конца), либо из-за неперехваченного исключения, вылетевшего из run(). Обратите внимание: даже если поток уже TERMINATED, объект класса Thread физически продолжает существовать, но повторно вызвать start() на нем нельзя – каждая нить может быть запущена только один раз. Попытка повторного запуска приведет к исключению IllegalThreadStateException.
 
Метод Thread.getState() позволяет узнать, в каком состоянии находится поток на текущий момент времени. Этот метод часто используют для отладки или мониторинга. Однако при интерпретации результатов нужно помнить, что состояние может мгновенно меняться: например, поток мог быть RUNNABLE в момент вызова getState(), а сразу после этого перейти в TERMINATED. Поэтому полагаться на getState() в рабочей логике программы обычно не следует – он больше диагностический. Также стоит понимать, что перечисленные состояния относятся к уровню JVM и не отображают полностью состояния потоков операционной системыdocs.oracle.com. Например, множество низкоуровневых статусов планировщика ОС (готов, спящий, ждущий ввода-вывода и т.д.) в Java сводятся к RUNNABLE или WAITING, чтобы упростить модель.
 
Дополнительно у потоков есть флаг демона (daemon). Демон-потоки – это потоки обслуживающие фоновые задачи приложения (например, сборщик мусора в JVM – daemon). Они отличаются тем, что JVM не ждет завершения daemon-потоков при остановке программы: если все непоток-демоны завершились, приложение заканчивает работу, даже если какие-то демоны еще работают. Сделать поток демоном можно вызовом thread.setDaemon(true) до старта потока. По состояниям daemon-потоки не отличаются от обычных, но их наличие влияет на время завершения всей программы.
 

Рейтинг@Mail.ru