Когда мы соприкасаемся с программированием, мы начинаем соприкасаться с различными жизненными циклами, такими как жизненный цикл объектов, жизненный цикл программ и т. д. Для потоков тоже есть свой жизненный цикл, и это также необходимо для собеседований и наших в -глубокое понимание многопоточности, сегодня мы в основном знакомимся с жизненным циклом потоков и переходами различных состояний.
Шесть состояний потока
Жизненный цикл потока в основном имеет следующие шесть состояний:
- Новый
- Запускаемый
- Заблокировано
- Ожидающий
- Ожидание по времени
- Прекращено
В нашей программе кодируют, если мы хотим определить текущее состояние потока, мы можем пройтиgetState()
метод для получения, и мы должны отметить, что любой поток может находиться только в одном состоянии в любой момент времени.
Новый Новый штат
- Прежде всего, мы покажем блок-схему перехода всего состояния потока.Далее мы дадим подробное введение и объяснение.Как показано на рисунке ниже, мы можем интуитивно увидеть переход шести состояний.Прежде всего, верхний левый это
NEW
состояние, в котором создается новый поток, эквивалентное нашемуnew Thread()
процесс.
-
New
Указывает состояние, в котором поток создан, но еще не запущен: когда мы используемnew Thread()
При создании нового потока, если поток еще не запущенstart()
метод, то поток не начинает выполнятьсяrun()
код в методе, то его состояниеNew
. И как только поток вызововstart()
, его состояние изменится сNew
статьRunnable
Введите зеленую коробку на рисунке
Родительское родительское состояние
-
Java
середина**Runable **
Состояние соответствует двум состояниям в состоянии потока операционной системы, которыеRunning
иReady
, это,Java
в центреRunnable
состояние потокаЕго можно исполнить, а можно и не реализовать., ожидая выделения ресурсов ЦП. -
Итак, если запущенный поток
Runnable
состояние, когда он выполняется на полпути к выполнению задачи, выполнить потокCPU
Планируется выполнение других действий, из-за чего поток временно не запускается, его состояние остается неизменным илиRunnable
, потому что его можно запланировать обратно, чтобы продолжить выполнение задачи в любое время.
**Заблокировано**
- Ключевое состояние потока распознается выше
Runnable
, то давайте взглянем на следующие три состояния, которые мы можем все вместе назвать состоянием блокировки.Blocked(被阻塞)
,Waiting(等待)
,Timed Waiting(计时等待)
.
Заблокировано заблокировано
- Сначала давайте познакомимся
Blocked
состояние, которое является относительно простым состоянием, как мы можем видеть на диаграмме ниже, отRunnable
Государственная записьBlocked
Есть только один путь в состояние, и это при входеsynchronized
не удалось получить соответствующийmonitor
замок (оmonitor
Мы введем замок позже, здесь мы знаемsynchronized
реализация основана наmonitor
Замок),
- Справа мы видим, что есть соединительные линии от
Blocked
статус указывает наRunnable
, и тут только один случай, тогда когда нить попадетmonitor
замок, нить войдетRunnable
участие в телеCPU
разграбление ресурсов
Состояние ожидания
Мы видели состояние блокировки выше, тогда давайте посмотримWaiting
статус, дляWaiting
Есть три ситуации для входа в состояние, как показано на следующем рисунке:
- Когда поток вызывается без установки
Timeout
параметрическийObject.wait()
метод - Когда вызовы потока не установлены
Timeout
параметрическийThread.join()
метод - Когда поток вызывает
LockSupport.park()
метод
о
LockSupport.park()
метод, давайте поговорим об этом здесь, мы знаем из вышеизложенногоBlocked
направлен наsynchronized monitor
заблокирован, но вJava
На самом деле есть много других замков, таких какReentrantLock
и т. д. В этих блокировках, если поток не получит блокировку, он войдет напрямуюWaiting
государство, по сути, это по сути казньLockSupport.park()
метод введенWaiting
государство
-
**Blocked **
и**Waiting**
Разница-
Blocked
ожидает освобождения других потоковmonitor
Замок -
Waiting
ожидает условия, напримерjoin
поток завершил выполнение, илиnotify()/notifyAll()
.
-
Ожидание по времени Состояние ожидания по времени
- Наконец, давайте поговорим об этом
Timed Waiting
состояние, которое связано сWaiting
Состояния очень похожи, единственная разница в том, есть ли ограничение по времени, вTimed Waiting
В состоянии он будет ждать тайм-аут, а затем проснется системой, или его также можно разбудить с помощью предварительного уведомления, напримерnotify
Из приведенного выше рисунка видно, что поток войдет в следующих случаяхTimed Waiting
государство.
- Поток выполняет заданные параметры времени
Thread.sleep(long millis)
метод; - Поток выполняет набор параметров времени
Object.wait(long timeout)
метод; - Поток выполняет набор параметров времени
Thread.join(long millis)
метод; - Поток выполняет набор параметров времени
LockSupport.parkNanos(long nanos)
Методы иLockSupport.parkUntil(long deadline)
метод.
Благодаря этому мы можем далее видеть, что это то же самое, что и состояние ожидания.
переход между состояниями потока
Выше мы говорили о характеристиках их соответствующих состояний и о ситуации, при которой состояние выполнения переходит в соответствующее состояние, далее разберем переход между соответствующими состояниями в дальнейшем, собственно, главноеBlocked
,waiting
,Timed Waiting
Переходы трех состояний и то, как они входят в следующее состояние и, наконец, входятRunnable
Blocked
ВходитьRunnable
- хочу от
Blocked
государственная записьRunnable
Государство, мы сказали выше, что нить должна быть полученаmonitor
Блокировка, но если вы хотите войти в другие состояния, она относительно особенная, потому что у нее нет механизма тайм-аута, то есть она не будет активно входить.
Как показано на следующем рисунке, линии выделены жирным фиолетовым цветом:
Waiting
ВходитьRunnable
- Только при выполнении
LockSupport.unpark()
,илиjoin
Выполнение потока заканчивается или может начаться, когда оно прерваноRunnable
государство. - Обозначено, как показано ниже
- Если вызывается другим потоком
notify()
илиnotifyAll()
чтобы разбудить его, он идет прямо кBlocked
Статус, здесь могут быть вопросы, напрямую не входитьRunnable
? Здесь нужно обратить внимание на одну вещь, потому что проснисьWaiting
Поток потока, если он вызываетсяnotify()
илиnotifyAll()
, необходимо сначала провестиmonitor
замок, вот о чем мы говоримwait()
,notify
Должен бытьsynchronized
в кодовом блоке. - так в
Waiting
Если поток в состоянии не может получить блокировку при пробуждении, он войдет вBlocked
состояние до выполненияnotify()/notifyAll()
Пробуждающий его поток завершает выполнение и освобождаетmonitor
Замок, вы можете обратиться к нему, чтобы схватить этот замок, если он может захватить, это будетBlocked
статус назадRunnable
государство.
Все должны обратить внимание на этот момент здесь, Когда мы просыпаемся через уведомление, мы сначала войдем в состояние блокировки, а затем мы войдем в состояние Runnable после того, как схватимся за горло блокировки монитора!
** «Временное ожидание» переходит в «Runnable» **
- Также в
Timed Waiting
выполнить вnotify()
иnotifyAll()
То же верно, они войдут первымиBlocked
состояние, а затем после успешного захвата блокировки вернуться кRunnable
государство.
- Но для ожидания по времени у него есть механизм тайм-аута, то есть, если время тайм-аута истекает, система автоматически получит блокировку напрямую или когда
join
Выполнение потока завершается/вызываетсяLockSupport.unpark()
/ прерывается и т. д. будет напрямую входитьRunnable
состояние, не переживаяBlocked
государство
Прекращено
Наконец, давайте поговорим о последнем состоянии,Terminated
Состояние прекращения, чтобы войти в это состояние, есть две возможности.
- После выполнения метода run() поток завершается нормально.
- Произошло неперехваченное исключение, завершающее работу метода run(), что привело к неожиданному завершению.
Суммировать
Напоследок поговорим о двух моментах, на которые необходимо обратить внимание при взгляде на процесс преобразования потоков:
-
Состояние потока находится в направлении стрелки, например, поток начинается с
New
Статус не доступен напрямуюBlocked
состояние, оно должно пройти сначалаRunnable
государство. -
Жизненный цикл потока необратим: После входа
Runnable
состояние не может быть возвращеноNew
состояние; после завершения дальнейшие изменения состояния невозможны. -
Таким образом, поток может иметь только один
New
иTerminated
состоянии и могут быть преобразованы друг в друга только в том случае, если они находятся в промежуточном состоянии. То есть эти два состояния не будут участвовать во взаимной трансформации.
Эта статья опубликована AnonyStar и может быть воспроизведена с указанием первоисточника.
Добро пожаловать в публичный аккаунт WeChat: шорткод Yunqi для получения более качественных статей
Для получения дополнительных статей обратите внимание на блог автора:Короткий код Yunqi i-code.online