Trådens livssyklus og trådtilstander - 1

"Hei, Amigo!"

"Vi skal starte et nytt emne: tråder."

"La oss komme i gang. I dag skal vi undersøke tilstandene som et trådobjekt passerer gjennom (eller kan passere gjennom) når en tråd kjører."

"Hvor mange stater kan du nevne akkurat nå, Amigo?"

"To. Den første er en tråd før start()-metoden kalles: objektet eksisterer, men tråden er ikke aktiv ennå. Og den andre er etter at start()-metoden er kalt: når tråden gjør noe viktig."

"Du har rett - det er en slik forskjell. Disse tilstandene kalles nye og kjører , men det er bare begynnelsen."

"For det første vil tråden på et tidspunkt fullføres, noe som betyr at det kan være en situasjon der trådobjektet eksisterer, men tråden ikke er i ny eller kjørende tilstand. "Denne tilstanden, der tråden er ferdig, kalles avsluttet ."

"Men det er mer. Ikke glem at bare én tråd faktisk kjører til enhver tid. Det som ser ut til å være samtidig arbeid er faktisk at prosessoren hele tiden hopper fra tråd til tråd. Det er en egen tilstand for når tråden ser ut til å være kjører, men venter faktisk på tur: det kalles klar til å kjøre . Ettersom en tråd fungerer, bytter den hele tiden fra løpende til klar , og så tilbake til løping når den blir aktiv igjen."

"Umiddelbart etter at start ()-metoden er kalt, blir tråden tildelt statusen klar til å kjøre og plasseres i en delt liste over tråder som JVM-en veksler mellom."

"Det er ikke så vanskelig. Før den begynner å kjøre, har den den nye tilstanden. Etter at den er ferdig, avsluttes den. Når den kjører , er tråden i kjøretilstand ; så når den venter, er den i klartilstand ."

"Kortheten din er fantastisk, men du har rett."

"Men det er mer. Tråden kan blokkeres. For eksempel når du går inn i en synkronisert blokk. Hvis en tråd kommer til en kodeblokk merket som synkronisert og en annen tråd bruker den, vil tråden vår gå inn i blokkert tilstand og vente for at objektets mutex (lås) skal frigjøres."

"Slik ser denne situasjonen med stater ut:"

Trådens livssyklus og trådtilstander - 2

"Men det er mer. Det er også en egen tilstand som kalles venter . Dette er når en tråd ikke er blokkert , men heller ikke klar . For eksempel når du kaller join ()-metoden på en annen tråd."

Når vi kaller join() på et annet Thread-objekt, er det som om tråden vår «joins» den, men i virkeligheten venter den bare på at den andre tråden er ferdig.

"I tillegg er det også wait ()-metoden (fra wait/notify/notifyAll-trioen av metoder), som bytter en tråd til ventetilstand når den kalles opp."

"Wow."

"Vent litt! Det er enda mer. En tråd kan sove ved for eksempel å kalle søvnmetoden. Det er også en egen tilstand for dette. Det kalles «tidsbestemt venter». «tidsbestemt venter» betyr at tråden venternoe for en begrenset tid. Hvis du kaller en ventemetode med en parameter, for eksempel wait(timeout) eller join(timeout), vil tråden gå inn i timed-waiting-tilstand."

"Her er hele diagrammet:"

Trådens livssyklus og trådtilstander - 3

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

"For nå er det det."

"I praksis kan du bare huske det første diagrammet. Det er enklere. Men det andre er mer nøyaktig."

"Merlig nok er det mange trådtilstandsdiagrammer på Internett, og de er alle forskjellige."

"Det er derfor jeg ga deg dette diagrammet - det er det mest komplette og korrekte."

"I dette diagrammet er klar- og kjøretilstanden kombinert i en enkelt blokk kalt runnable. Vet du hvorfor?"

"Nei. Det er første gang jeg har sett noe sånt."

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

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

"Du kan alltid kalle getState ()-metoden på et Thread- objekt, og finne ut dets nåværende tilstand. Og, selvfølgelig, vil det være en av State enum-verdiene."

"Jeg skjønner. Så, de virkelige tilstandene er inne i JVM, men det er også tilstander som du kan få tilgang til via Java-kode ved å bruke State getState()-metoden."

"Og under hvilke omstendigheter ville jeg bruke det?"

"Sannsynligvis aldri."

"Men du må vite hva som skjer i tråder. Ellers vil du ha mange feil, og du vil ikke engang kunne gjette hva som forårsaker dem."

"I tillegg elsker arbeidsgivere å spørre om trådtilstander under intervjuer."