A Thread.join () metódus Java-ban

1. Áttekintés

Ebben az oktatóanyagban megvitatjuk a másikat csatlakozik() módszerek a cérna osztály. Megyünk ezeknek a módszereknek a részleteire és néhány példakódra.

Mint a várjon() és értesítési () módszerek, csatlakozik() a szálak közötti szinkronizálás másik mechanizmusa.

Gyorsan áttekintheti ezt az oktatóanyagot, amelyről bővebben olvashat várjon() és értesít ().

2. A Thread.join () Módszer

A csatlakozási módszert a cérna osztály:

public final void join () dobja az InterruptedException-t

Várja, hogy ez a szál meghaljon.

Amikor a csatlakozik() metódus egy szálon, a hívó szál várakozási állapotba kerül. Várakozási állapotban marad, amíg a hivatkozott szál le nem áll.

Ezt a viselkedést a következő kódban láthatjuk:

class SampleThread kiterjeszti a szálat {public int processingCount = 0; SampleThread (int processingCount) {this.processingCount = processingCount; LOGGER.info ("Szál létrehozva"); } @Orride public void run () {LOGGER.info ("Szál" + this.getName () + "elindult"); while (processingCount> 0) {próbáld meg {Thread.sleep (1000); } catch (InterruptedException e) {LOGGER.info ("Szál" + this.getName () + "megszakítva"); } processingCount--; } LOGGER.info ("Szál" + this.getName () + "kilépés"); }} @Test public void givenStartedThread_whenJoinCalled_waitsTillCompletion () dobja az InterruptedException {Thread t2 = new SampleThread (1); t2.start (); LOGGER.info ("Csatlakozás meghívása"); t2.csatlakozzon (); LOGGER.info ("Visszatért a csatlakozásból"); assertFalse (t2.isAlive ()); } 

A kód végrehajtásakor a következőkhöz hasonló eredményekre kell számítanunk:

INFO: Szál létrehozva INFO: Csatlakozás meghívása INFO: 1. szál indítása INFO: 1. szál szál kilép INFO: Visszatért a csatlakozás

A csatlakozik() A metódus akkor is visszatérhet, ha a hivatkozott szál megszakadt. Ebben az esetben a módszer egy InterruptedException.

Végül, ha a hivatkozott szál már megszűnt, vagy még nem indult el, akkor a csatlakozik() A módszer azonnal visszatér.

Szál t1 = new SampleThread (0); t1.csatlakozzon (); // azonnal visszatér

3. Thread.join () Módszerek időtúllépéssel

A csatlakozik() A módszer továbbra is várakozik, ha a hivatkozott szál blokkolva van, vagy túl sokáig tart a feldolgozása. Ez problémává válhat, mivel a hívó szál nem reagál. Ezeknek a helyzeteknek a kezeléséhez a csatlakozik() módszer, amely lehetővé teszi számunkra az időkorlát megadását.

Két időzített verzió van, amely túlterheli a csatlakozik() módszer:

„Nyilvános végleges érvénytelen csatlakozás (hosszú millis) dob InterruptedException

Legfeljebb vár millis ezredmásodpercek alatt elhal ez a szál. A 0 időkorlát azt jelenti, hogy örökké várni kell. ”

„Nyilvános végleges érvénytelen csatlakozás (hosszú millis, intnanók) dob InterruptedException

Legfeljebb vár millis ezredmásodperc plusz nanók nanoszekundumokkal, hogy ez a szál meghaljon. ”

Használhatjuk az időzítettet csatlakozik() az alábbi:

@Test public void givenStartedThread_whenTimedJoinCalled_waitsUntilTimedout () thrugs InterruptedException {Thread t3 = new SampleThread (10); t3.start (); t3.csatlakozás (1000); assertTrue (t3.isAlive ()); } 

Ebben az esetben a hívó szál nagyjából 1 másodpercet vár a t3 szál befejezésére. Ha a t3 szál ebben az időszakban nem fejeződik be, akkor a csatlakozik() metódus visszaadja a vezérlést a hívó metódusnak.

Időzített csatlakozik() az időzítéstől függ az operációs rendszertől. Tehát nem feltételezhetjük ezt csatlakozik() pontosan addig vár, amíg meg van határozva.

4. Thread.join () Módszerek és szinkronizálás

A felmondásig várakozás mellett a csatlakozik() A módszer szinkronizáló hatású. a join () létrejön egy esemény előtt kapcsolat:

"A szál összes művelete megtörténik, mielőtt bármely más szál sikeresen visszatérne a szál csatlakozásából ()."

Ez azt jelenti, hogy amikor egy t1 szál meghívja a t2.join () függvényt, akkor a t2 által végrehajtott összes változás visszatéréskor látható a t1-ben. Ha azonban nem hivatkozunk csatlakozik() vagy más szinkronizációs mechanizmust használ, nincs garancia arra, hogy a másik szál változásai akkor is láthatók lesznek az aktuális szál számára, ha a másik szál befejeződött.

Ezért, annak ellenére, hogy a csatlakozik() A metódus meghívása egy lezárt állapotú szálra azonnal visszatér, bizonyos helyzetekben mégis meg kell hívnunk.

Az alábbiakban láthatunk egy példát a nem megfelelően szinkronizált kódra:

SampleThread t4 = új SampleThread (10); t4.start (); // nem garantált, hogy leáll akkor is, ha a t4 befejeződik. do {} while (t4.processingCount> 0);

A fenti kód megfelelő szinkronizálásához időzített értéket adhatunk hozzá t4.csatlakozzon () a hurok belsejében, vagy használjon más szinkronizációs mechanizmust.

5. Következtetés

csatlakozik() A módszer nagyon hasznos a szálak közötti szinkronizáláshoz. Ebben a cikkben megvitattuk a csatlakozik() módszerek és viselkedésük. A kód használatával is áttekintettük csatlakozik() módszer.

Mint mindig, a teljes forráskód megtalálható a GitHubon.


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