Введение в состояние потока Java с примером - жизненный цикл потока

Опубликовано: 2019-01-11
Введение в состояние потока Java с примером

Состояния потока

Следующая диаграмма иллюстрирует различные состояния, в которых может находиться поток Java в любой момент своей жизни, и вызовы методов, вызывающие переход в другое состояние. Эта диаграмма не является полной конечной диаграммой состояний, а представляет собой обзор наиболее интересных и общих аспектов жизни потока.

Вы обратились по адресу, если у вас есть какие-либо из следующих вопросов:

  • Жизненный цикл потока в Java
  • Жизненный цикл и состояния потока в Java
  • Понимание состояний потоков Java

В оставшейся части этой страницы обсуждается Thread's life cycle с точки зрения его состояния.

Состояние потока Java с примером

Новый поток

Следующий оператор создает новый поток, но не запускает его, тем самым оставляя поток в состоянии, отмеченном на диаграмме New Thread.

Когда поток находится в состоянии New Thread , это просто пустой объект Thread. Системные ресурсы для него пока не выделены. Таким образом, когда поток находится в этом состоянии, вы можете только запустить его или остановить; вызов любого другого метода, кроме start() или stop() , когда поток находится в этом состоянии, не имеет смысла и вызывает исключение IllegalThreadStateException.

Запускаемый

Теперь рассмотрим эти две строки кода:

Метод start() создает системные ресурсы, необходимые для запуска потока, планирует выполнение потока и вызывает метод run() потока. В этот момент поток находится в состоянии «Работает». Это состояние называется «Runnable», а не «Running», потому что поток может фактически не выполняться, когда он находится в этом состоянии. Многие компьютеры имеют один процессор, что делает невозможным одновременный запуск всех потоков «Runnable».

Таким образом, исполняющая система Java должна реализовать схему планирования, которая разделяет процессор между всеми «выполняемыми» потоками. Однако в большинстве случаев состояние «Работает» можно рассматривать как просто «Работает». Когда поток запущен — он «выполняется» и является текущим потоком — инструкции в его run() выполняются последовательно.

Не работает

Поток переходит в состояние Not Runnable , когда происходит одно из следующих четырех событий:

  • кто-то вызывает его метод suspend()
  • кто-то вызывает его метод sleep()
  • поток использует свой метод wait() для ожидания условной переменной
  • поток блокируется при вводе-выводе.

Например, жирная строка в этом фрагменте кода

переводит myThread в спящий режим на 10 секунд (10 000 миллисекунд). В течение этих 10 секунд, даже если бы процессор стал доступным, myThread не запустился бы. По истечении 10 секунд myThread становится «Runnable», и теперь, если процессор становится доступным, myThread будет работать.

Для каждого из «входов» в состояние «Not Runnable», перечисленных выше, существует определенный и отличный путь выхода, который возвращает поток в состояние «Runnable». Путь эвакуации работает только для соответствующего «входа». Например, если поток был переведен в спящий режим, то должно пройти указанное количество миллисекунд, прежде чем поток снова станет «Работоспособным». Вызов resume() в спящем потоке не имеет никакого эффекта.

Далее указан путь эвакуации для каждого входа в состояние «Не работает».

  • Если поток был переведен в спящий режим, должно пройти указанное количество миллисекунд.
  • Если поток был приостановлен, то кто-то должен вызвать его метод resume() .
  • Если поток ожидает переменную условия, любой объект, владеющий переменной, должен отказаться от нее, вызвав либо notify( notify() , либо notifyAll() .
  • Если поток заблокирован при вводе-выводе, указанная команда ввода-вывода должна быть завершена.
java-поток-учебник

мертв

Поток может умереть двумя способами: либо по естественным причинам, либо будучи убитым (остановленным). Поток естественным образом умирает, когда его метод run() завершается нормально. Например, цикл while в этом методе является конечным циклом — он повторяется 100 раз, а затем завершается.

Поток с этим методом run() естественным образом завершится после завершения цикла и метода run() .

Вы также можете завершить поток в любое время, вызвав его метод stop() . Этот фрагмент кода.

создает и запускает myThread а затем переводит текущий поток в спящий режим на 10 секунд. Когда текущий поток просыпается, выделенная жирным шрифтом строка в сегменте кода уничтожает myThread .

Метод stop() бросает объект ThreadDeath в поток, чтобы убить его. Таким образом, когда поток уничтожается таким образом, он умирает асинхронно. Поток умрет, когда он действительно получит исключение ThreadDeath.

Нелегалтреадстатеексцептион

Система среды выполнения генерирует исключение IllegalThreadStateException, когда вы вызываете метод в потоке, а состояние этого потока не позволяет вызвать этот метод. Например, исключение IllegalThreadStateException возникает, когда вы вызываете suspend() для потока, который не является «Runnable».

Как показано в различных примерах потоков в этом уроке, когда вы вызываете метод потока, который может генерировать исключение, вы должны либо перехватить и обработать исключение, либо объявить, что вызывающий метод генерирует неперехваченное исключение.

Метод isAlive()

И последнее слово о состоянии потока: программный интерфейс для класса Thread включает метод isAlive() . isAlive() возвращает true, если поток был запущен и не остановлен. Таким образом, если метод isAlive() возвращает false , вы знаете, что поток является либо «Новым потоком», либо «Мертвым».

Если метод isAlive() возвращает значение true , вы знаете, что поток либо «работает», либо «не работает». Вы не можете отличить «Новую тему» ​​от «Мертвой» темы; вы также не можете провести различие между потоком «Runnable» и «Not Runnable».

Просматривая примеры сложных потоков, нашел в сети этот действительно отличный учебник. Всем следует внимательно прочитать это.