logo

Життєвий цикл і стани потоку в Java

А нитка в Java може існувати в будь-якому з наступних станів у будь-який момент часу. Потік знаходиться лише в одному з показаних станів у будь-який момент:

  1. Нова держава
  2. Запускний стан
  3. Заблокований стан
  4. Стан очікування
  5. Час очікування
  6. Припинений стан

Діаграма нижче представляє різні стани потоку в будь-який момент:

Lifecycle-and-States-of-a-Thread-in-Java' title=




Життєвий цикл потоку 

Існує кілька станів потоку в життєвому циклі, як зазначено нижче:

  1. Нова тема: Коли створюється новий потік, він знаходиться в новий стан . Потік ще не почав працювати, коли потік знаходиться в цьому стані. Коли потік знаходиться в новому стані, його код ще не запущений і не почав виконуватися.
  2. Запускний стан : Нитка, тобто готовий до запуску переходить у робочий стан. У цьому стані потік може бути запущений або готовий до виконання в будь-який момент часу. Відповідальність планувальника потоку полягає в тому, щоб надати потоку час для виконання. Багатопотокова програма виділяє фіксований проміжок часу кожному окремому потоку. Кожен потік отримує невелику кількість часу для виконання. Після роботи на деякий час потік призупиняється та відмовляється від ЦП, щоб інші потоки могли працювати.
  3. заблоковано: Потік буде в заблокованому стані коли він намагається отримати блокування але наразі блокування отримано іншим потоком. Потік перейде із заблокованого стану в стан, що виконується, коли він отримає блокування.
  4. Стан очікування : Потік буде в стані очікування коли він викликає wait() метод або приєднатися() метод. Він перейде в робочий стан, коли інший потік сповістить або цей потік буде припинено.
  5. Час очікування : Потік знаходиться в тимчасовому стані очікування, коли він викликає метод із параметром тайм-ауту . Потік знаходиться в цьому стані, доки не закінчиться час очікування або не буде отримано сповіщення. Наприклад, коли потік викликає сплячий режим або умовне очікування, він переходить у стан очікування за часом.
  6. Припинений стан: Потік завершується через одну з таких причин: 
    • Тому що виходить нормально. Це відбувається, коли код потоку повністю виконано програмою.
    • Оскільки сталася якась незвичайна помилкова подія, наприклад помилка сегментації або необроблена виняткова ситуація.

Стани потоку в Java

У Java для отримання поточного стану потоку використовуйте Thread.getState() метод для отримання поточного стану потоку. Java надає java.lang.Thread.State enum, який визначає константи ENUM для стану потоку, короткий опис якого наведено нижче: 

1. Новий 

Стан потоку для потоку, який ще не почався. 

різниця між гігабайтом і мегабайтом

public static final Thread.State НОВЕ

2. Працездатний 

Стан потоку для поточного потоку. Потік у доступному для виконання стані виконується у віртуальній машині Java, але він може чекати інших ресурсів від операційної системи, наприклад процесора. 

public static final Thread.State RUNNABLE

3. Заблоковано 

Стан потоку для потоку, заблокованого в очікуванні блокування монітора. Потік у заблокованому стані очікує блокування монітора, щоб увійти в синхронізований блок/метод або повторно ввести синхронізований блок/метод після виклику Object.wait(). 

public static final Thread.State ЗАБЛОКУВАНО

4. Очікування 

 Стан потоку для потоку, що очікує. Потік перебуває в стані очікування через виклик одного з таких методів: 

  • Object.wait без часу очікування
  • Thread.join без тайм-ауту
  • LockSupport.park

public static final Thread.State WAITING

які місяці q1

5. Час очікування 

Стан потоку для потоку, що очікує, із заданим часом очікування. Потік перебуває в стані тимчасового очікування через виклик одного з наведених нижче методів із заданим позитивним часом очікування: 

  • Нитка.сон
  • Object.wait із тайм-аутом
  • Thread.join із тайм-аутом
  • LockSupport.parkNanos
  • LockSupport.parkUntil

загальнодоступний статичний остаточний Thread.State TIMED_WAITING

6. Припинено 

Стан потоку для завершеного потоку. Потік завершено. 

public static final Thread.State ПРИПИНЕНО


Приклад демонстрації станів потоку

Нижче наведено реальний приклад системи бронювання квитків, яка демонструє різні стани потоку:

приклад:

Java
// Java program to demonstrate thread states  // using a ticket booking scenario class TicketBooking implements Runnable {  @Override  public void run() {    try {    // Timed waiting  Thread.sleep(200);   } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println('State of bookingThread while mainThread is waiting: ' +  TicketSystem.mainThread.getState());  try {    // Another timed waiting  Thread.sleep(100);   } catch (InterruptedException e) {  e.printStackTrace();  }  } } public class TicketSystem implements Runnable {  public static Thread mainThread;  public static TicketSystem ticketSystem;  @Override  public void run() {  TicketBooking booking = new TicketBooking();  Thread bookingThread = new Thread(booking);  System.out.println('State after creating bookingThread: ' + bookingThread.getState());  bookingThread.start();  System.out.println('State after starting bookingThread: ' + bookingThread.getState());  try {  Thread.sleep(100);  } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println('State after sleeping bookingThread: ' + bookingThread.getState());  try {    // Moves mainThread to waiting state  bookingThread.join();   } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println('State after bookingThread finishes: ' + bookingThread.getState());  }  public static void main(String[] args) {  ticketSystem = new TicketSystem();  mainThread = new Thread(ticketSystem);  System.out.println('State after creating mainThread: ' + mainThread.getState());  mainThread.start();  System.out.println('State after starting mainThread: ' + mainThread.getState());  } } 


gimp видалити водяний знак

Вихід:

Вихід' loading='lazy' title=


Пояснення:

  • Коли створюється новий потік, він перебуває в стані НОВИЙ. Коли метод start() викликається в потоці, планувальник потоків переводить його в стан Runnable.
  • Щоразу, коли метод join() викликається в екземплярі потоку, основний потік переходить до очікування завершення потоку резервування.
  • Після завершення виконання методу потоку його стан стає завершеним.
Створіть вікторину