Thread.join () -metoden i Java

1. Oversikt

I denne opplæringen vil vi diskutere de forskjellige bli med() metoder i Tråd klasse. Vi vil gå inn i detaljene i disse metodene og noen eksempler på kode.

Som vente() og varsle () metoder, bli med() er en annen mekanisme for synkronisering mellom tråder.

Du kan ta en rask titt på denne veiledningen for å lese mer om vente() og gi beskjed().

2. Den Thread.join () Metode

Sammenføyningsmetoden er definert i Tråd klasse:

offentlig endelig ugyldig delta () kaster InterruptedException

Venter på at denne tråden skal dø.

Når vi påkaller bli med() metode på en tråd, går anropstråden i ventetilstand. Den forblir i ventetilstand til den refererte tråden avsluttes.

Vi kan se denne oppførselen i følgende kode:

klasse SampleThread utvider tråd {public int processingCount = 0; SampleThread (int processingCount) {this.processingCount = processingCount; LOGGER.info ("Tråd opprettet"); } @ Override public void run () {LOGGER.info ("Thread" + this.getName () + "started"); while (processingCount> 0) {prøv {Thread.sleep (1000); } fange (InterruptedException e) {LOGGER.info ("Tråd" + this.getName () + "avbrutt"); } processingCount--; } LOGGER.info ("Thread" + this.getName () + "exiting"); }} @Test offentlig ugyldighet gittStartedThread_whenJoinCalled_waitsTillCompletion () kaster InterruptedException {Thread t2 = new SampleThread (1); t2.start (); LOGGER.info ("Invoking join"); t2.join (); LOGGER.info ("Returned from join"); assertFalse (t2.isAlive ()); } 

Vi bør forvente resultater som ligner på følgende når vi kjører koden:

INFO: Tråd opprettet INFO: Påkaller join INFO: Tråd Tråd-1 startet INFO: Tråd Tråd-1 avsluttende INFO: Returnert fra sammenføyning

De bli med() metoden kan også returnere hvis den refererte tråden ble avbrutt. I dette tilfellet kaster metoden en InterruptedException.

Endelig, Hvis den refererte tråden allerede var avsluttet eller ikke har blitt startet, kan du ringe til bli med() metoden returnerer umiddelbart.

Tråd t1 = ny SampleThread (0); t1.join (); // returnerer umiddelbart

3. Thread.join () Metoder med tidsavbrudd

De bli med() metoden vil vente hvis den refererte tråden er blokkert eller tar for lang tid å behandle. Dette kan bli et problem ettersom ringetråden ikke reagerer. For å håndtere disse situasjonene bruker vi overbelastede versjoner av bli med() metode som lar oss spesifisere en tidsavbruddsperiode.

Det er to tidsbestemte versjoner som overbelaster bli med() metode:

“Offentlig endelig ugyldig delta (lang millis) kaster InterruptedException

Venter på det meste millis millisekunder for at denne tråden skal dø. En tidsavbrudd på 0 betyr å vente for alltid. ”

“Offentlig endelig ugyldig delta (lang millis, intnanoer) kaster InterruptedException

Venter på det meste millis millisekunder pluss nanoer nanosekunder for at denne tråden skal dø. ”

Vi kan bruke tidsbestemt tid bli med() som Nedenfor:

@Test offentlig ugyldig givenStartedThread_whenTimedJoinCalled_waitsUntilTimedout () kaster InterruptedException {Thread t3 = new SampleThread (10); t3.start (); t3.join (1000); assertTrue (t3.isAlive ()); } 

I dette tilfellet venter den anropende tråden i omtrent 1 sekund til tråden t3 er ferdig. Hvis tråden t3 ikke avsluttes i denne tidsperioden, vil bli med() metoden returnerer kontrollen til anropsmetoden.

Tidsbestemt bli med() er avhengig av operativsystemet for timing. Så vi kan ikke anta det bli med() vil vente nøyaktig så lenge som spesifisert.

4. Thread.join () Metoder og synkronisering

I tillegg til å vente til oppsigelse, ringe bli med() metoden har en synkroniseringseffekt. bli med () skaper et forhold som skjer før:

"Alle handlinger i en tråd skjer - før noen annen tråd returnerer fra en join () på den tråden."

Dette betyr at når en tråd t1 kaller t2.join (), så er alle endringer gjort av t2 synlige i t1 ved retur. Men hvis vi ikke påberoper oss bli med() eller bruker andre synkroniseringsmekanismer, har vi ingen garanti for at endringer i den andre tråden vil være synlig for den gjeldende tråden selv om den andre tråden er fullført.

Derfor, selv om bli med() metoden kall til en tråd i den avsluttede tilstanden returnerer umiddelbart, vi trenger fortsatt å kalle det i noen situasjoner.

Vi kan se et eksempel på feil synkronisert kode nedenfor:

SampleThread t4 = ny SampleThread (10); t4.start (); // garanterer ikke å stoppe selv om t4 er ferdig. gjør {} mens (t4.processingCount> 0);

For å synkronisere riktig kode ovenfor, kan vi legge til tidsbestemt t4.join () inne i løkken eller bruk en annen synkroniseringsmekanisme.

5. Konklusjon

bli med() metoden er ganske nyttig for synkronisering mellom tråder. I denne artikkelen diskuterte vi bli med() metoder og deres oppførsel. Vi gjennomgikk også kode ved hjelp av bli med() metode.

Som alltid kan hele kildekoden finnes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found