Обратите внимание на публичный аккаунтJavaStorm
На уровне операционной системы потоки также имеют [жизненный цикл], который является основой параллельного программирования, и нам необходимо их освоить.Механизм перехода состояния каждого узла в жизненном циклеи удерживайте состояние блокировки. В тексте будет представлен цикл системы и разница в жизненном цикле языка программирования Java. Чтобы открыть параллельное программирование и супервизоров, вам нужно иметь четкое представление об основах менталитета.
общий жизненный цикл
Его можно описать в «пентальной модели», как показано ниже, соответственно:Исходное состояние, работоспособное состояние, рабочее состояние, спящее состояние, завершенное состояние.
- начальное состояние: Поток создан, но процессор не может быть выделен для выполнения.Это уникально для языка программирования.Он создается только на языке программирования, а не на уровне операционной системы.
- рабочее состояние: ЦП может быть выделен для выполнения, а операционная система также создает потоки.
- Рабочий статус: Поток в рабочем состоянии преобразуется в рабочее состояние, когда он получает квант времени ЦП.
- состояние сна: когда поток в состоянии выполнения вызывает блокирующий API или ожидает события, он переключается в состояние сна и освобождает права на использование ЦП.Когда происходит событие ожидания, поток переходит из состояния сна в состояние готовности к выполнению .
- состояние окончания: выполнение потока завершено или исключение переходит в состояние завершения, что означает завершение жизненного цикла потока.
Жизненный цикл потока в Java
Далее мы рассмотрим фокус жизненного цикла Java, всего шесть состояний, а именно:
- Новый (Новый): Когда программа использует новое ключевое слово для создания потока. В этот момент JVM выделяет для него память и инициализирует значения его переменных-членов.
-
Запускаемый: при вызове
start()
метод, поток находится в рабочем состоянии. Виртуальная машина Java создает для нее программируемый счетчик стека вызовов методов и ожидает выполнения расписания. -
Состояние работы (Выполняется): Поток находится в состоянии выполнения, полученный фрагмент ЦП, выполненный
run()
метод. - Заблокировано: Когда работающий поток теряет свои ресурсы.
- мертв: программа завершилась нормально, или поток выдал неперехваченное исключение или ошибку. Или вызовите метод прерывания потока.
Не пытайтесь перезапустить умерший поток, вызвав метод start(). Смерть есть смерть, и поток не может быть снова выполнен как поток.
Поток состояния преобразования, как показано ниже:
Новое, работоспособное состояние
Когда поток создается с использованием нового ключевого слова, для него выделяется только память виртуальной машиной Java и инициализируются значения его переменных-членов. В это время объект потока не показывает никаких динамических характеристик потока, и программа не будет выполнять тело выполнения потока.
Когда объект потока вызываетstart()
метод, поток находится всостояние готовности. Виртуальная машина Java создает для него стек вызовов методов и программный счетчик, поток в этом состоянии не запускается, а только указывает, что поток может выполняться. Что касается того, когда поток запускается, это зависит от планирования планировщика потоков в JVM.
注意:启动线程使用 start() 方法,而不是 run() 方法。 перечислить
start()
Метод запускает поток, и система обрабатывает метод запуска как исполнителя метода. Что нужно помнить, так это то, что поток, вызывающийrun()
После метода поток больше не находится в новом состоянии, больше не вызыватьstart()
метод, который можно вызывать только для потоков во вновь созданном состоянииstart()
метод, иначе будет выдано исключение IllegaIThreadStateExccption.
1. Переход состояния между RUNNABLE и BLOCKED
Нитки ожидают синхронизированные неявные блокировки, синхронизированные модифицированные методы и блоки кода позволяют только один нить выполнить одновременно, другие потоки могут только подождать, несколько человек в канаве хотят дерьмо, только один человек допускается только внутри, а другие могут быть только За дверью ждать. В это время ожидающая поток будет переходить от Runnable для заблокированного состояния. Когда в ожидании поток приобретает синхронизированный неявный замок, он переходит от заблокированного на прогонзуемое состояние. Потому что я получил квитанцию, чтобы пойти в Маукен.
2. Преобразование статуса.
Есть три сценария, которые запускают этот переход состояния.
- Вызов потока для получения синхронизированной блокировки
Object.wait()
метод. Блокировка будет снята, а планирование сегмента ЦП будет отменено. - перечислить
Thread.join()
метод. Если поток объекта потока A, вызовитеA.join()
, Нить выполнения этого оператора будет ждать резьба выполненного и станет оперативной, как от ожидания ждать этого потока. Например, основной поток ждет резьба выполненного, то основной нить становится состоянием ожидания. - перечислить
LockSupport.park()
метод. Блокировки параллельных пакетов Java основаны на этой реализации, вызываяLockSupport.park()
метод снятия блокировки. Текущий поток будет заблокирован, и состояние потока перейдет из RUNNABLE в WAITING. перечислитьLockSupport.unpark(Thread thread)
Целевой поток можно разбудить, и после того, как целевой поток соревнуется за блокировку, его состояние перейдет из состояния WAITING в RUNNABLE.
3. Переход состояния между RUNNABLE и TIMED_WAITING
Сценарий триггера выглядит следующим образом:
- вызов с параметром тайм-аута
Thread.sleep(long millis)
, не снимает блокировку. - Поток, получивший синхронизированную неявную блокировку, вызываетс параметром тайм-аутаиз
Object.wait(long timeout)
метод; снимет блокировку. - перечислитьс параметром тайм-аутаиз
Thread.join(long millis)
метод; - перечислитьс параметром тайм-аутаиз
LockSupport.parkNanos(Object blocker, long deadline)
метод; снимет блокировку. - перечислитьс параметром тайм-аутаиз
LockSupport.parkUntil(long deadline)
метод. освободит замок.
На самом деле больше параметров тайм-аута.
4. Из рабочего состояния в завершенное
нить законченаrun()
метод, он автоматически перейдет в завершенное состояние, но при запускеrun()
Когда метод ненормальный, он также приведет к прекращению потока, иногда нам нужно прерываться.run()
Реализация метода, например, некоторые люди занимают хижину в течение длительного времени без гадания, мы должны взрывать его, люди не могут больше ждать, и они собираются умереть. В Java есть класс потоковstop()
метод, но помечен как @Deprecated, поэтому его использование не рекомендуется. Правильная осанка на самом деле зоветinterrupt()
метод.
В чем основное различие между методами stop() и interrupt()?
Метод stop() действительно убивает поток, не давая ему возможности дышать.Если поток удерживает синхронизированную неявную блокировку и не освобождает ее, то у других потоков никогда не будет возможности получить синхронизированную неявную блокировку. слишком Опасно. Поэтому этот метод не рекомендуется.К подобным методам относятся методы suspend() и возобновить(). Эти два метода также не рекомендуются, поэтому я не буду их здесь представлять.
Метод interrupt() намного мягче, метод interrupt() только информирует поток, который имеет возможность выполнить некоторые последующие операции, а также может проигнорировать это уведомление. Как прерванный поток получает уведомление? Один - аномалия, а другой - активное обнаружение.
Суммировать
Понимание потоков Java, а также жизненного цикла различных состояний для диагностики многопоточной ошибки очень полезно, очень сложно отлаживать многопоточные программы, ошибка в основном зависит от журнала, дампа потока для отслеживания проблем, базового Дамп потока анализа - это состояние потока анализа, большинство проблем взаимоблокировки, голодания, блокировки в реальном времени необходимо отслеживать и анализировать состояние потока. В то же время в этой статье описывается жизненный цикл потока с сильной универсальностью, для многопоточного программирования изучение других языков также является большим подспорьем.
ты можешь пройтиjstack
команда илиJava VisualVM
.