Примеры Java - Получить состояние потока

Java 实例Примеры Java

В жизненном цикле потока Java класс Thread имеет перечислимый тип State, который определяет несколько состояний потока, а именно:

  • Новая
  • Runnable
  • Blocked
  • Waiting
  • Timed Waiting
  • Terminated

Описание каждого состояния:

1. Начальное состояние — NEW

Объявление:

public static final Thread.State NEW

Реализация интерфейса Runnable и наследование от Thread позволяют создать класс потока. Когда экземпляр создаётся с помощью new, поток переходит в начальное состояние.

2. RUNNABLE

Объявление:

public static final Thread.State RUNNABLE

2.1. Состояние готовности

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

Вызов метода start() потока переводит поток в состояние готовности.

Когда завершается метод sleep() текущего потока, завершается join() другого потока, заканчивается ожидание ввода пользователя или поток получает блокировку объекта, эти потоки также переходят в состояние готовности.

Когда текущий поток израсходовал свой квант времени или для текущего потока вызывается метод yield(), текущий поток переходит в состояние готовности.

После того как поток в пуле блокировок получает блокировку объекта, он переходит в состояние готовности.

2.2. Состояние выполнения

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

3. Состояние блокировки — BLOCKED

Объявление:

public static final Thread.State BLOCKED

Состояние BLOCKED — это состояние, когда поток блокируется при входе в метод или блок кода, изменённый ключевым словом synchronized (получение блокировки).

4. Ожидание — WAITING

Объявление:

public static final Thread.State WAITING

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

5. Ожидание с тайм-аутом — TIMED_WAITING

Объявление:

public static final Thread.State TIMED_WAITING

Потокам в этом состоянии не выделяется процессорное время, но им не нужно ждать бесконечно, чтобы быть явно разбуженными другими потоками; через определённое время они автоматически проснутся.

6. Состояние завершения — TERMINATED

Объявление:

public static final Thread.State TERMINATED

Когда метод run() потока завершается или метод main() главного потока завершается, мы считаем поток завершённым. Объект потока может быть ещё жив, но он больше не является отдельным выполняющимся потоком. После завершения поток нельзя возродить.

Вызов метода start() у завершённого потока выбрасывает java.lang.IllegalThreadStateException.

Следующий пример демонстрирует, как получить состояние потока:

Файл Main.java

//Java-программа — демонстрация состояния потока class thread implements Runnable { public void run() { //thread2 - Ожидание по времени try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Состояние thread1, пока он вызвал метод join() у thread2 -"+ Test.thread1.getState()); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } public class Test implements Runnable { public static Thread thread1; public static Test obj; public static void main(String[] args) { obj = new Test(); thread1 = new Thread(obj); //Создан thread1, теперь он находится в начальном состоянии System.out.println("Состояние thread1 после его создания - " + thread1.getState()); thread1.start(); //thread1 - Состояние готовности System.out.println("Состояние thread1 после вызова метода .start() для него - " + thread1.getState()); } public void run() { thread myThread = new thread(); Thread thread2 = new Thread(myThread); //Создан thread1, теперь он находится в начальном состоянии System.out.println("Состояние thread2 после его создания - "+ thread2.getState()); thread2.start(); //thread2 - Состояние готовности System.out.println("Состояние thread2 после вызова метода .start() для него - " + thread2.getState()); // перевод thread1 в состояние ожидания с таймаутом try { //перевод - Ожидание с таймаутом Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Состояние thread2 после вызова метода .sleep() для него - "+ thread2.getState() ); try { //Ожидание завершения thread2 thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Состояние thread2 после завершения его выполнения - " + thread2.getState()); } }

Вывод вышеприведённого кода:

State of thread1 after creating it - NEW
State of thread1 after calling .start() method on it - RUNNABLE
State of thread2 after creating it - NEW
State of thread2 after calling .start() method on it - RUNNABLE
State of thread2 after calling .sleep() method on it - TIMED_WAITING
State of thread1 while it called join() method on thread2 -WAITING
State of thread2 when it has finished it's execution - TERMINATED

Java 实例Примеры Java

Другие расширения