Жизнен цикъл и състояния на нишката - 1

„Здрасти, Амиго!“

„Ще започнем нова тема: нишки.“

„Нека да започнем. Днес ще разгледаме състоянията, през които обект Thread преминава (or може да премине), когато нишката се изпълнява.“

„Колко щата можеш да назовеш в момента, Амиго?“

"Две. Първата е нишка преди методът start() да бъде извикан: обектът съществува, но нишката все още не е активна. А втората е след като методът start() е извикан: когато нишката прави нещо важно."

„Прав си – има такова разграничение. Тези състояния се наричат ​​нови и работещи , но това е само началото.“

"Първо, в даден момент нишката ще приключи да работи, което означава, че може да има ситуация, в която обектът Thread съществува, но нишката не е в ново or работещо състояние. "Това състояние, при което нишката е приключила, се нарича прекратено ."

„Но има още. Не забравяйте, че във всеки един момент действително работи само една нишка. Това, което изглежда като едновременна работа, всъщност е, че процесорът постоянно прескача от нишка на нишка. Има отделно състояние, когато нишката изглежда е работи, но всъщност чака реда си: нарича се готова за изпълнение . Докато една нишка работи, тя непрекъснато превключва от работеща на готова и след това обратно към работеща , когато стане отново активна."

„Веднага след извикването на метода start (), на нишката се присвоява състояние на готовност за изпълнение и се поставя в споделен списък с нишки, между които JVM превключва.“

„Това не е твърде трудно. Преди да започне да се изпълнява, той има новото състояние. След като приключи, той се прекратява . Когато работи, нишката е в състояние на изпълнение ; тогава, когато чака, тя е в състояние на готовност ."

— Краткостта ви е удивителна, но сте прав.

„Но има още. Нишката може да бъде блокирана. Например, когато въведете синхронизиран блок. Ако нишка стигне до codeов блок, маркиран като синхронизиран , и друга нишка го използва, тогава нашата нишка ще влезе в блокирано състояние и ще изчака за да бъде освободен мютексът (заключването) на обекта."

„Ето How изглежда тази ситуация с държавите:“

Жизнен цикъл и състояния на нишката - 2

„Но има още нещо. Има и отделно състояние, наречено чакане . Това е, когато една нишка не е блокирана , но също така не е готова . Например, когато извикате метода join () на друга нишка.“

Когато извикаме join() на друг обект Thread, все едно нашата нишка се «присъединява» към него, но в действителност тя просто чака другата нишка да приключи.

„Освен това има и методът wait () (от триото методи wait/notify/notifyAll), който превключва нишка в състояние на изчакване , когато бъде извикана.“

"Уау!"

"Чакай малко! Има още повече. Нишката може да заспи, като извика метода на заспиване, например. Има и отделно състояние за това. Нарича се «времево чакане». «времево чакане» означава, че нишката чака нещо за ограничено време. Ако извикате метод на изчакване с параметър, като изчакване (изчакване) or присъединяване (изчакване), тогава нишката ще влезе в състояние на изчакване по време."

„Ето пълната диаграма:“

Жизнен цикъл и състояния на нишката - 3

"Хм. Това ли е всичко? Или има още 10 интересни щата?"

— Засега толкова.

"На практика можете просто да запомните първата диаграма. Тя е по-проста. Но втората е по-точна."

„Колкото и да е странно, в интернет има много диаграми на състоянието на нишките и всички те са различни.“

— Ето защо ви дадох тази диаграма — тя е най-пълната и правилна.

„В тази диаграма състоянията на готовност и работещи са комбинирани в един блок, наречен runnable. Знаете ли защо?“

"Не. За първи път виждам нещо подобно."

„ Класът Thread има вътрешен клас, наречен State , Howто и публичен метод State getState() .“

Пример
public enum State
{
 NEW,
 RUNNABLE,
 BLOCKED,
 WAITING,
 TIMED_WAITING,
 TERMINATED;
}

„Винаги можете да извикате метода getState () на обект Thread и да разберете текущото му състояние. И, разбира се, това ще бъде една от стойностите на State enum.“

„Разбирам. И така, реалните състояния са вътре в JVM, но има и състояния, до които можете да получите достъп чрез Java code, като използвате метода State getState().“

— И при Howви обстоятелства бих използвал това?

— Най-вероятно никога.

„Но трябва да знаете Howво се случва вътре в нишките. В противен случай ще имате много грешки и дори няма да можете да познаете Howво ги причинява.“

„Освен това работодателите обичат да питат за състоянията на Thread по време на интервюта.“