Состояния потока выполнения. Метод getState(). Пример
Содержание
- 1. Состояния потоков выполнения и их представление в Java. Перечисление Thread.State
- 2. Метод getState(). Общая форма
- 3. Пример, демонстрирующий определение состояний потоков выполнения
- Связанные темы
Поиск на других ресурсах:
1. Состояния потоков выполнения и их представление в Java. Перечисление Thread.State
После создания, поток выполнения может находиться в нескольких состояниях. В языке Java состояния потоков выполнения определяются заранее определенными константами из перечисления State класса Thread. Ниже приведено описание этих состояний
BLOCKED - Поток приостановил выполнение потому что ожидает получения блокировки NEW - Поток создан, но он еще не начал своего выполнения RUNNABLE - Поток сейчас выполняется или начнет выполняться, когда получит доступ к центральному процессору TERMINATED - Поток приостановил выполнение на заданный промежуток времени после вызова методов sleep(), wait(), join() WAITING - Поток приостановил выполнение до ожидания некоторого действия (вызова методов wait() или join() без указанного времени ожидания)
На рисунке 1 изображены возможные изменения и направления состояний потока выполнения.
Рисунок 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
⇑
Связанные темы
- Многозадачность. Потоки выполнения. Основные понятия
- Средства Java для работы с потоками выполнения. Класс Thread. Интерфейс Runnable. Главный поток выполнения. Создание дочернего потока
- Методы класса Thread: getName(), run(), start(), sleep(). Примеры
- Методы класса Thread: join(), isAlive(), getPriority(), setPriority(). Примеры
- Синхронизация потоков. Монитор. Общие понятия. Ключевое слово synchronized
- Взаимодействие между приложениями. Методы wait(), notify(), notifyAll()
⇑