Trådens livscykel och trådtillstånd - 1

"Hej, Amigo!"

"Vi kommer att starta ett nytt ämne: trådar."

"Låt oss komma igång. Idag kommer vi att undersöka tillstånden som ett trådobjekt passerar genom (eller kan passera) när en tråd körs."

"Hur många stater kan du namnge just nu, Amigo?"

"Två. Den första är en tråd innan metoden start() anropas: objektet finns, men tråden är inte aktiv än. Och den andra är efter att metoden start() har anropats: när tråden gör något Viktig."

"Du har rätt - det finns en sådan skillnad. Dessa tillstånd kallas nya och löpande , men det är bara början."

"För det första kommer tråden vid något tillfälle att slutföras, vilket betyder att det kan finnas en situation där trådobjektet existerar, men tråden inte är i det nya eller pågående tillståndet. "Detta tillstånd, där tråden har körts färdigt, kallas avslutas ."

"Men det finns mer. Glöm inte att vid varje given tidpunkt är det bara en tråd som faktiskt körs. Det som verkar vara samtidigt arbete är faktiskt att processorn hela tiden hoppar från tråd till tråd. Det finns ett separat tillstånd för när tråden verkar vara igång, men väntar faktiskt på sin tur: det kallas färdig att köra . När en tråd fungerar växlar den hela tiden från igång till klar , och sedan tillbaka till körning när den blir aktiv igen."

"Omedelbart efter att start ()-metoden har anropats, tilldelas tråden statusen redo att köras och placeras i en delad lista över trådar som JVM växlar mellan."

"Det är inte så svårt. Innan den börjar köra har den det nya tillståndet. När den är klar avslutas den. När den körs är tråden i driftläge ; sedan när den väntar är den i redoläge . ."

"Din korthet är fantastisk, men du har rätt."

"Men det finns mer. Tråden kan blockeras. Till exempel när du går in i ett synkroniserat block. Om en tråd kommer till ett kodblock markerat som synkroniserat och en annan tråd använder det, kommer vår tråd att gå in i blockerat tillstånd och väntar för att objektets mutex (lås) ska frigöras."

"Så här ser situationen ut med stater:"

Trådens livscykel och trådtillstånd - 2

"Men det finns mer. Det finns också ett separat tillstånd som heter väntande . Det här är när en tråd inte är blockerad , men inte heller klar . Till exempel när du anropar metoden join () på en annan tråd."

När vi anropar join() på ett annat Thread-objekt är det som om vår tråd «joins» i det, men i verkligheten väntar den bara på att den andra tråden ska avslutas.

"Dessutom finns det också metoden wait () (från wait/notify/notifyAll trio av metoder), som växlar en tråd till vänteläge när den anropas."

"Oj."

"Vänta lite! Det finns ännu mer. En tråd kan sova genom att till exempel anropa sömnmetoden. Det finns också ett separat tillstånd för detta. Det kallas "tidsinställd väntan". "tidsinställd väntan" betyder att tråden väntarnågot för en begränsad tid. Om du anropar en väntemetod med en parameter, t.ex. wait(timeout) eller join(timeout), kommer tråden att gå in i det tidsinställda väntande tillståndet."

"Här är hela diagrammet:"

Trådens livscykel och trådtillstånd - 3

"Hmm. Är det allt? Eller finns det 10 fler intressanta stater?"

"För nu är det allt."

"I praktiken kan du bara komma ihåg det första diagrammet. Det är enklare. Men det andra är mer exakt."

"Konstigt nog finns det många trådtillståndsdiagram på Internet, och de är alla olika."

"Det är därför jag gav dig det här diagrammet - det är det mest kompletta och korrekta."

"I det här diagrammet är redo- och körtillstånden kombinerade i ett enda block som kallas körbart. Vet du varför?"

"Nej. Det är första gången jag har sett något sådant."

" Trådklassen har en inre klass som heter State , såväl som en public State getState()- metod."

Exempel
public enum State
{
 NEW,
 RUNNABLE,
 BLOCKED,
 WAITING,
 TIMED_WAITING,
 TERMINATED;
}

"Du kan alltid anropa metoden getState () på ett Thread- objekt och ta reda på dess nuvarande tillstånd. Och, naturligtvis, kommer det att vara ett av State enum-värdena."

"Jag förstår. Så, de verkliga tillstånden finns inuti JVM, men det finns också tillstånd som du kan komma åt via Java-kod med hjälp av metoden State getState()."

"Och under vilka omständigheter skulle jag använda det?"

"Med största sannolikhet aldrig."

"Men du måste veta vad som händer i trådar. Annars kommer du att ha massor av buggar, och du kommer inte ens att kunna gissa vad som orsakar dem."

"Dessutom älskar arbetsgivare att fråga om trådtillstånd under intervjuer."