Стани потоку виконання. Метод 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(). Приклади
⇑