Thread.join () -metoden i Java

1. Oversigt

I denne vejledning diskuterer vi de forskellige tilslutte() metoder i Tråd klasse. Vi går ind på detaljerne i disse metoder og nogle eksempler på kode.

Ligesom vente() og underret () metoder, tilslutte() er en anden mekanisme til synkronisering mellem tråde.

Du kan få et hurtigt kig på denne vejledning for at læse mere om vente() og underrette().

2. Den Thread.join () Metode

Forbindelsesmetoden er defineret i Tråd klasse:

offentlig endelig ugyldig deltagelse () kaster InterruptedException

Venter på, at denne tråd dør.

Når vi påberåber os tilslutte() metode på en tråd, går den kaldende tråd i ventetilstand. Det forbliver i ventetilstand, indtil den refererede tråd slutter.

Vi kan se denne adfærd i følgende kode:

klasse SampleThread udvider tråd {public int processingCount = 0; SampleThread (int processingCount) {this.processingCount = processingCount; LOGGER.info ("Tråd oprettet"); } @ Override public void run () {LOGGER.info ("Tråd" + this.getName () + "startet"); while (processingCount> 0) {prøv {Thread.sleep (1000); } fange (InterruptedException e) {LOGGER.info ("Tråd" + this.getName () + "afbrudt"); } processingCount--; } LOGGER.info ("Tråd" + this.getName () + "spændende"); }} @ Test offentlig ugyldighed givenStartedThread_whenJoinCalled_waitsTillCompletion () kaster InterruptedException {Thread t2 = new SampleThread (1); t2.start (); LOGGER.info ("Påkaldelse af deltagelse"); t2.join (); LOGGER.info ("Returneret fra deltagelse"); assertFalse (t2.isAlive ()); } 

Vi skal forvente resultater svarende til følgende, når vi udfører koden:

INFO: Tråd oprettet INFO: Påkalder join INFO: Tråd Tråd-1 startet INFO: Tråd Tråd-1 afsluttende INFO: Returneret fra sammenføjning

Det tilslutte() metoden kan også vende tilbage, hvis den refererede tråd blev afbrudt. I dette tilfælde kaster metoden en Afbrudt undtagelse.

Langt om længe, hvis den refererede tråd allerede var afsluttet eller ikke er startet, skal du ringe til tilslutte() metoden vender straks tilbage.

Tråd t1 = ny SampleThread (0); t1.forbinde (); // vender straks tilbage

3. Thread.join () Metoder med timeout

Det tilslutte() metoden venter, hvis den refererede tråd er blokeret eller tager for lang tid at behandle. Dette kan blive et problem, da opkaldstråden ikke reagerer. For at håndtere disse situationer bruger vi overbelastede versioner af tilslutte() metode, der giver os mulighed for at specificere en timeout-periode.

Der er to tidsbestemte versioner, der overbelaster tilslutte() metode:

“Offentlig endelig ugyldig deltagelse (lang millis) kaster InterruptedException

Vent højst millis millisekunder for at denne tråd skal dø. En timeout på 0 betyder at vente for evigt. ”

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

Vent højst millis millisekunder plus nanoer nanosekunder for at denne tråd skal dø. ”

Vi kan bruge det tidsindstillede tilslutte() som nedenfor:

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

I dette tilfælde venter den opkaldende tråd i ca. 1 sekund, indtil tråden t3 er færdig. Hvis tråden t3 ikke slutter i denne tidsperiode, vises tilslutte() metode returnerer kontrol til opkaldsmetoden.

Tidsindstillet tilslutte() er afhængig af operativsystemet for timing. Så vi kan ikke antage det tilslutte() venter nøjagtigt så længe som angivet.

4. Thread.join () Metoder og synkronisering

Ud over at vente til opsigelse, ringe til tilslutte() metode har en synkroniseringseffekt. join () skaber et happenings-før-forhold:

"Alle handlinger i en tråd sker - før enhver anden tråd med succes vender tilbage fra en sammenføjning () på den tråd."

Dette betyder, at når en tråd t1 kalder t2.join (), så er alle ændringer udført af t2 synlige i t1 ved retur. Men hvis vi ikke påberåber os tilslutte() eller bruger andre synkroniseringsmekanismer, har vi ingen garanti for, at ændringer i den anden tråd vil være synlige for den aktuelle tråd, selvom den anden tråd er afsluttet.

Derfor, selvom tilslutte() metode kald til en tråd i den afsluttede tilstand vender straks tilbage, vi skal stadig kalde det i nogle situationer.

Vi kan se et eksempel på forkert synkroniseret kode nedenfor:

SampleThread t4 = ny SampleThread (10); t4.start (); // garanteres ikke at stoppe, selvom t4 er færdig. gør {} mens (t4.processingCount> 0);

For korrekt at synkronisere ovenstående kode kan vi tilføje tidsindstillet t4.tilslut () inde i sløjfen eller brug en anden synkroniseringsmekanisme.

5. Konklusion

tilslutte() metode er ret nyttig til synkronisering mellem tråde. I denne artikel diskuterede vi tilslutte() metoder og deres adfærd. Vi gennemgik også kode ved hjælp af tilslutte() metode.

Som altid kan den fulde kildekode findes på GitHub.


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