Java. Состояния потока выполнения

Состояния потока выполнения. Метод getState(). Пример


Содержание


Поиск на других ресурсах:




1. Состояния потоков выполнения и их представление в Java. Перечисление Thread.State

После создания, поток выполнения может находиться в нескольких состояниях. В языке Java состояния потоков выполнения определяются заранее определенными константами из перечисления State класса Thread. Ниже приведено описание этих состояний

BLOCKED     - Поток приостановил выполнение потому что ожидает получения блокировки
NEW         - Поток создан, но он еще не начал своего выполнения
RUNNABLE   - Поток сейчас выполняется или начнет выполняться, когда получит
             доступ к центральному процессору
TERMINATED - Поток приостановил выполнение на заданный промежуток времени
             после вызова методов sleep(), wait(), join()
WAITING     - Поток приостановил выполнение до ожидания некоторого действия
              (вызова методов wait() или join() без указанного времени ожидания)

На рисунке 1 изображены возможные изменения и направления состояний потока выполнения.

Java. Потоки выполнения. Схема изменения состояний потока выполнения

Рисунок 1. Схема изменения состояний потока выполнения

 

2. Метод getState(). Общая форма

Для получения состояния потока выполнения используется метод getState() класса Thread. Общая форма метода следующая:

public Thread.State getState()

здесь

  • Thread.State – тип перечисления, что определяет возможные состояния потока выполнения: NEW, BLOCKED, RUNNABLE, TERMINATED, WAITING.

Если класс реализует поток выполнения, то в этом классе можно получить состояние потока примерно по следующей схеме:

class MyThread implements Runnable {
  // Ссылка на поток
  Thread thr;

  // Конструктор класса
  MyThread() {

    ...

    // Создать поток
    thr = new Thread(this);

    ...
  }

  // код потока
  run() {
    // Получить состояние потока
    Thread.State ts;
    ts = thr.getState();

    // Обработать состояние потока
    if (ts == Thread.State.BLOCKED) {
      ...
    }
    else
    if (ts == Thread.State.NEW) {
      ...
    }
    else
    if (ts == Thread.State.RUNNABLE) {
      ...
    }
    else 
    if (ts == Thread.State.TIMED_WAITING) {
      ...
    }
    else {
      // Обработка состояния Thread.State.WAITING
      ...
    }
  }
}

 

3. Пример, демонстрирующий определение состояний потоков выполнения

В примере определяются состояния главного и дочернего потоков. Значение состояния выводится в статическом методе State класса ProcessState.

// Класс, содержащий статический метод, который обрабатывает состояние потока
class ProcessState {
  public static String State(Thread.State ts) {
    if (ts == Thread.State.BLOCKED)
      return "BLOCKED";
    if (ts == Thread.State.NEW)
      return "NEW";
    if (ts == Thread.State.RUNNABLE)
      return "RUNNABLE";
    if (ts == Thread.State.TIMED_WAITING)
      return "TIMED_WAITING";
    return "WAITING";
  }
}

// Класс, инкапсулирующий поток выполнения
class MyThread implements Runnable {
  Thread t;

  // Конструктор
  MyThread(String threadName) {
    // Создать поток с именем threadName и запустить его на выполнение
    t = new Thread(this, threadName);

    // Поток еще не запущен, вывести состояние потока
    Thread.State ts = t.getState();
    System.out.println("State of MyThread in constructor: " + ProcessState.State(ts));

    // Запустить поток на выполнение
    t.start();
  }

  // Код выполнения потока
  public void run() {
    Thread.State ts = t.getState();
    System.out.println("State of MyThread in run() method: " + ProcessState.State(ts));
  }
}

public class ThreadState {

  public static void main(String[] args) {
    // 1. Определить состояние дочернего потока
    MyThread mt = new MyThread("mt"); // Создать и запустить поток

    try {
      mt.t.join();
      System.out.println("State after join(): " + ProcessState.State(mt.t.getState()));
    }
    catch (InterruptedException e) {
      e.printStackTrace();
    }

    // 2. Определить состояние главного потока
    Thread thr = Thread.currentThread();
    try {
      Thread.sleep(2000);
      System.out.println("Main thread after sleep(): " + ProcessState.State(thr.getState()));
    }
    catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

Результат выполнения программы

State of MyThread in constructor: NEW
State of MyThread in run() method: RUNNABLE
State after join(): WAITING
Main thread after sleep(): RUNNABLE

 


Связанные темы