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

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

Обратите внимание на публичный аккаунт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.

JavaStorm