A Java Thread.yield () rövid bemutatása

1. Áttekintés

Ebben az oktatóanyagban feltárjuk a módszert hozam() ban ben cérna osztály.

Összehasonlítjuk a Java-ban elérhető más párhuzamossági idiómákkal, és végül megvizsgáljuk annak gyakorlati alkalmazását.

2. Az összefoglaló hozam()

Amint a hivatalos dokumentáció azt sugallja, hozam() mechanizmust biztosít az „ütemező” tájékoztatásához arról az aktuális szál hajlandó lemondani a processzor jelenlegi használatáról, de szeretné, ha a lehető leghamarabb visszarendelnék.

Az „ütemező” szabadon betarthatja vagy figyelmen kívül hagyhatja ezeket az információkat, sőt, az operációs rendszertől függően eltérő viselkedéssel rendelkezik.

A következő kódrészlet két szálat jelenít meg ugyanazon prioritással, minden ütemezés után:

public class ThreadYield {public static void main (String [] args) {Futható r = () -> {int számláló = 0; while (számláló <2) {System.out.println (Thread.currentThread () .getName ()); számláló ++; Szál.hozam (); }}; új szál (r) .start (); új szál (r) .start (); }}

Amikor a fenti programot többször megpróbáljuk futtatni, akkor különböző eredményeket kapunk; közülük néhányat az alábbiakban említünk:

1. futás:

Thread-0 Thread-1 Thread-1 Thread-0

2. menet:

Téma-0 Téma-0 Téma-1 Téma-1

Tehát amint láthatja a viselkedését hozam() nem determinisztikus és platformfüggő is.

3. Összehasonlítás más szólásokkal

Vannak más konstrukciók is a szálak relatív progressziójának befolyásolására. Tartalmazzák várjon(), értesít () és értesítMinden () részeként Tárgy osztály, csatlakozik() részeként cérna osztály, és alvás() részeként cérna osztály.

Lássuk, hogyan viszonyulnak hozzájuk hozam().

3.1. hozam() vs. várjon()

  • Míg hozam() az aktuális szál összefüggésében hívják meg, várjon() csak egy szinkronizált blokkban vagy módszerben kifejezetten megszerzett záron lehet meghívni
  • nem úgy mint hozam(), lehetséges várakozás() megadhat egy minimális időtartamot, amíg várni kell a szál újbóli ütemezésére
  • Val vel várjon() a szál bármikor felébreszthető a. meghívásával is értesít () vagy értesítMinden () az érintett zár tárgyon

3.2. hozam() vs. alvás()

  • Míg hozam() csak heurisztikus kísérletet tehet az aktuális szál végrehajtásának felfüggesztésére, anélkül, hogy garantálná, hogy mikor kerül visszarendezésre, alvás() arra kényszerítheti az ütemezőt, hogy az aktuális szál végrehajtását legalább az említett időtartamra függessze fel paraméterként.

3.3. hozam() vs. csatlakozik()

  • Az aktuális szál meghívhatja csatlakozik() bármely más szálon, amely az aktuális szálat várja, amíg a másik szál meghal, mielőtt folytatja
  • Opcionálisan megadhat egy paramétert egy időtartamot, amely jelzi a maximális időt, amelyre az aktuális szálnak várnia kell, mielőtt folytatja

4. Használat a hozam()

Mivel a hivatalos dokumentáció azt sugallja, hogy ritkán szükséges használni hozam() és ezért el kell kerülni, hacsak viselkedése fényében nem világos a célkitűzések között.

Ennek ellenére, néhány felhasználásra hozam() tartalmazzák az egyidejűség-vezérlő konstrukciók tervezését, a rendszer érzékenységének javítását egy számításigényes programban stb.

Ezeket a felhasználásokat azonban részletes profilalkotással és benchmarkolással kell kísérni a kívánt eredmény biztosítása érdekében.

5. Következtetés

Ebben a rövid cikkben a hozam() módszer a cérna osztályban, és egy kódrészleten keresztül látta viselkedését és korlátait.

Megvizsgáltuk összehasonlítását más, a Java-ban elérhető párhuzamossági idiómákkal, és végül megvizsgáltunk néhány felhasználási esetet hozam() hasznos lehet.

Mint mindig, itt is megnézheti a cikkben található példákat a GitHubon.