Trådens livscyklus og trådtilstande - 1

"Hej, Amigo!"

"Vi vil starte et nyt emne: tråde."

"Lad os komme i gang. I dag vil vi undersøge de tilstande, som et trådobjekt passerer igennem (eller måske passerer igennem), når en tråd løber."

"Hvor mange stater kan du nævne lige nu, Amigo?"

"To. Den første er en tråd før start()-metoden kaldes: objektet eksisterer, men tråden er ikke aktiv endnu. Og den anden er efter start()-metoden er blevet kaldt: når tråden gør noget vigtig."

"Du har ret - der er sådan en forskel. Disse tilstande kaldes nye og kørende , men det er kun begyndelsen."

"For det første vil tråden på et tidspunkt afslutte at køre, hvilket betyder, at der kan være en situation, hvor trådobjektet eksisterer, men tråden ikke er i den nye eller kørende tilstand. "Denne tilstand, hvor tråden er færdig med at køre, kaldes opsagt ."

"Men der er mere. Glem ikke, at der på et givet tidspunkt kun kører én tråd. Det, der ser ud til at være samtidig arbejde, er faktisk, at processoren konstant hopper fra tråd til tråd. Der er en separat tilstand for hvornår tråden ser ud til at være kører, men venter faktisk på sin tur: det kaldes klar til at køre . Som en tråd fungerer, skifter den konstant fra kørende til klar , og så tilbage til at køre , når den bliver aktiv igen."

"Umiddelbart efter start ()-metoden kaldes, tildeles tråden status klar til at køre og placeres i en delt liste over tråde, som JVM'en skifter mellem."

"Det er ikke så svært. Før den begynder at køre, har den den nye tilstand. Efter den er færdig, afsluttes den . Når den kører , er tråden i køretilstand ; så når den venter, er den i klartilstand ."

"Din korthed er fantastisk, men du har ret."

"Men der er mere. Tråden kan blokeres. For eksempel når du indtaster en synkroniseret blok. Hvis en tråd kommer til en kodeblok markeret som synkroniseret , og en anden tråd bruger den, så går vores tråd i blokeret tilstand og venter for at udløse objektets mutex (lås).

"Sådan ser denne situation med stater ud:"

Trådens livscyklus og trådtilstande - 2

"Men der er mere. Der er også en separat tilstand kaldet venter . Dette er når en tråd ikke er blokeret , men heller ikke klar . For eksempel når du kalder join ()-metoden på en anden tråd."

Når vi kalder join() på et andet Thread-objekt, er det som om vores tråd «joins» det, men i virkeligheden venter den bare på, at den anden tråd er færdig.

"Derudover er der også wait () metoden (fra wait/notify/notifyAll trioen af ​​metoder), som skifter en tråd til ventetilstand , når den kaldes."

"Hov."

"Vent et øjeblik! Der er stadig mere. En tråd kan sove ved at kalde søvnmetoden, for eksempel. Der er også en separat tilstand for dette. Det kaldes "tidsindstillet venter". "tidsindstillet venter" betyder, at tråden venternoget for en begrænset tid. Hvis du kalder en ventemetode med en parameter, såsom wait(timeout) eller join(timeout), så vil tråden gå i timed-waiting-tilstand."

"Her er hele diagrammet:"

Trådens livscyklus og trådtilstande - 3

"Hmm. Er det alt? Eller er der 10 flere interessante tilstande?"

"For nu er det det."

"I praksis kan du bare huske det første diagram. Det er enklere. Men det andet er mere præcist."

"Mærkeligt nok er der mange trådtilstandsdiagrammer på internettet, og de er alle forskellige."

"Det er derfor, jeg gav dig dette diagram - det er det mest komplette og korrekte."

"I dette diagram er klar- og køretilstanden kombineret i en enkelt blok kaldet runnable. Ved du hvorfor?"

"Nej. Det er første gang, jeg har set sådan noget."

" Trådklassen har en indre klasse kaldet State , samt en offentlig State getState()- metode."

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

"Du kan altid kalde getState ()-metoden på et Thread- objekt og finde ud af dets aktuelle tilstand. Og, selvfølgelig, vil det være en af ​​State enum-værdierne."

"Jeg kan se. Så de rigtige tilstande er inde i JVM, men der er også tilstande, som du kan få adgang til via Java-kode ved hjælp af State getState()-metoden."

"Og under hvilke omstændigheder ville jeg bruge det?"

"Sandsynligvis aldrig."

"Men du skal vide, hvad der foregår inde i tråde. Ellers vil du have masser af fejl, og du vil ikke engang være i stand til at gætte, hvad der forårsager dem."

"Derudover elsker arbejdsgivere at spørge om trådtilstande under interviews."