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

 


Зв’язані теми