"Hei, Amigo!
"Alt nytt er bare noe gammelt som vi har glemt. I dag skal jeg snakke om å stoppe tråder. Jeg håper du allerede har glemt hvordan interrupt()-metoden fungerer."
"Ja, Ellie, jeg har helt glemt det."
"Flott. Da skal jeg minne deg på det."
"I Java, hvis noen ønsker å stoppe en løpende tråd, kan han signalisere dette til tråden. For å gjøre dette må du sette Thread-objektets skjulte isInterrupted- variabel til true."
"Hver Thread har en interrupt()-metode, som brukes til å sette dette flagget. Når interrupt ( )-metoden kalles, settes isInterrupted- variabelen inne i Thread-objektet til true."
"Og når Thread.sleep()- eller join()-metoden kalles på en tråd, sjekker metoden om isInterrupted-flagget er satt for gjeldende tråd. Hvis dette flagget er satt (variabelen isInterrupted er lik true), vil metodene kast et avbrutt unntak ."
"Her skal jeg minne deg på et gammelt eksempel:"
Kode | Beskrivelse |
---|---|
|
Klokkens kjøremetode henter Thread-objektet for gjeldende tråd.
Klokkeklassen skriver ordet "Tick" til konsollen en gang per sekund så lenge den gjeldende trådens isInterrupt-variabel er falsk. Når isInterrupt blir sann, avsluttes kjøremetoden. |
|
Hovedtråden starter en barnetråd (klokke) som skal løpe for alltid.
Vent 10 sekunder og avbryt oppgaven ved å ringe avbruddsmetoden. Hovedtråden fullfører arbeidet. Klokketråden fullfører arbeidet. |
"Her bruker vi sleep- metoden som en del av en uendelig sløyfe i kjøremetoden . I løkken sjekkes isInterrupt- variabelen automatisk. Hvis en tråd kaller sleep- metoden, sjekker metoden først om isInterrupt er sant for den tråden (den en som kalte sleep-metoden). Hvis det er sant, vil ikke metoden sove. I stedet kaster den et InterruptedException ."
"Men i dette eksemplet sjekker vi konstant variabelen isInterrupted i løkkens tilstand."
"Jeg husker at det var noen grunner til at vi ikke kunne bruke denne tilnærmingen. Kan du minne meg på det?"
" For det første har ikke kjøremetoden alltid en løkke. Metoden kan ganske enkelt bestå av noen få dusin kall til andre metoder. I dette tilfellet må du legge til en isInterrupted-sjekk før hvert metodekall. "
" For det andre kan en metode som involverer mange forskjellige handlinger ta veldig lang tid å utføre."
" For det tredje erstatter ikke det å kaste et unntak isInterrupted-kontrollen. Det er bare et praktisk tillegg. Det kastede unntaket lar deg raskt trekke tilbake anropsstakken tilbake til selve kjøringsmetoden. "
" For det fjerde brukes søvnmetoden mye. Det viser seg at denne nyttige metoden er forbedret av en implisitt sjekk som ikke er mindre nyttig. Det er som om ingen spesifikt har lagt til sjekken, men der er den. Dette er veldig verdifullt når du bruker en annens kode og du kan ikke legge til sjekken selv."
" For det femte forringer ikke tilleggskontrollen ytelsen. Å kalle søvnmetoden betyr at tråden ikke skal gjøre noe (bortsett fra å sove), så ekstraarbeidet plager ingen."
"Det er akkurat det du sa tidligere."
"Og hva med utsagnet ditt, « Ingen kan garantere at en tråd vil bli stoppet. Bare en tråd kan stoppe seg selv. » Kan du forklare det?"
"Sikker."
"Tidligere, i tidlige versjoner av Java, hadde tråder en stop()-metode. Og når du kalte den, stoppet JVM faktisk tråden. Men hvis en tråd gjorde noe utenfor JVM (for eksempel, skrev til en fil eller ringte OS-funksjoner) når det ble avbrutt på denne måten, forårsaket avbruddet mange problemer, for eksempel ulukkede filer, ufrigitte systemressurser, etc."
"En generalforsamling av Javas skapere besluttet å fjerne metoden for å tvangsstoppe tråder. Nå kan vi bare sette et bestemt flagg (isInterrupted) og håpe at trådkoden ble skrevet riktig, slik at dette flagget vil bli behandlet. Dette flagget er som et skilt som sier: 'Tråd, stopp, vær så snill. Det er veldig viktig!'. Men om det stopper eller ikke er dens egen sak."
"Men hva med InterruptedException?"
"Hva om koden som kjører på denne tråden har en haug med try-catch-blokker? Selv om et InterruptedException oppstår et sted, er det definitivt ingen garanti for at noen try-catch ikke fanger den og glemmer den. Så det er ingen garantier for tråden vil stoppe."
"En annen ting er at tråder allerede regnes som ganske lavt nivå programmering. Men jeg skal fortelle deg om det neste gang."
"Du er ikke Ellie - du er Scheherazade!"
"Så, Amigo! Er alt i den nåværende leksjonen klart?"
"Japp."
"Ok bra."
GO TO FULL VERSION