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

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

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

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

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

Lifecycle-and-States-of-a-Thread-in-Java


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

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

  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

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  ());      }   }   


Вихід:

Вихід


Пояснення:

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