Домой Учебники по Java и J2EE Java: введение в состояние потока с примером

Java: введение в состояние потока с примером

697
0

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

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

Новый поток

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

1
Тема myThread знак равно новый MyThreadClass ( ) ;

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

Runnable

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

1
2
Тема myThread знак равно новый MyThreadClass ( ) ;
myThread . начало ( ) ;

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

Не работает

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

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

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

1
2
3
4
5
6
Тема myThread знак равно новый MyThreadClass ( ) ;
myThread . начало ( ) ;
пытаться {
     < strong > myThread . сон ( 10000 ) ; < / strong >
} ловить ( InterruptedException е ) {
}

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

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

ЧИТАТЬ ТАКЖЕ:  Как создать .zip или .tar программно на Java с использованием архиваторов и компрессоров Apache Commons

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

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

мертв

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

1
2
3
4
5
6
7
общественности недействительным запустить ( ) {
     ИНТ я знак равно 0 ;
     в то время как ( я < 100 ) {
я ++ ;
Система. вне. println ( я = + я ) ;
     }
}

Нить с этим run() метод умрет естественно после цикла и run() Метод завершен.

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

1
2
3
4
5
6
7
Тема myThread знак равно новый MyThreadClass ( ) ;
myThread . начало ( ) ;
пытаться {
     Thread. currentThread ( ) . сон ( 10000 ) ;
} ловить ( InterruptedException е ) {
}
< strong > myThread . стоп ( ) ; < / strong >

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

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

IllegalThreadStateException

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

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

Метод isAlive ()

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

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

Если вы ищете больше примеров Java, посетите: https://crunchify.com/java-web-development-tutorial/

Java: введение в состояние потока с примером

0.00 (0%) 0 votes

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь