Stručný úvod do Java Thread.yield ()

1. Prehľad

V tomto tutoriále preskúmame túto metódu výnos () v Závit trieda.

Porovnáme to s inými idiómami súbežnosti dostupnými v Jave a nakoniec preskúmame ich praktické aplikácie.

2. Synopsa výnos ()

Ako naznačuje oficiálna dokumentácia, výnos () poskytuje mechanizmus na informovanie „plánovača“, že súčasné vlákno je ochotné vzdať sa svojho súčasného používania procesora, ale chce byť naplánované späť čo najskôr.

„Plánovač“ môže tieto informácie dodržiavať alebo ignorovať a v skutočnosti sa líši v závislosti od operačného systému.

Nasledujúci fragment kódu zobrazuje dve vlákna s rovnakou prioritou, ktoré sa získajú po každom pláne:

public class ThreadYield {public static void main (String [] args) {Runnable r = () -> {int counter = 0; while (counter <2) {System.out.println (Thread.currentThread () .getName ()); pult ++; Thread.yield (); }}; new Thread (r) .start (); new Thread (r) .start (); }}

Keď sa pokúsime vyššie uvedený program spustiť viackrát, získame odlišné výsledky; niektoré z nich sú uvedené nižšie:

Beh 1:

Vlákno-0 Vlákno-1 Vlákno-1 Vlákno-0

Beh 2:

Vlákno-0 Vlákno-0 Vlákno-1 Vlákno-1

Takže ako vidíte správanie výnos () je nedeterministický a tiež závislý od platformy.

3. Porovnanie s inými idiómami

Na ovplyvnenie relatívneho vývoja vlákien existujú ďalšie konštrukty. Zahŕňajú počkaj (), upozorniť () a notifyAll () ako súčasť Objekt trieda, pripojiť sa () ako súčasť Závit triedy a spánok () ako súčasť Závit trieda.

Pozrime sa, ako sa majú v porovnaní s výnos ().

3.1. výnos () vs počkaj ()

  • Zatiaľ čo výnos () je vyvolaná v kontexte aktuálneho vlákna, počkaj () je možné vyvolať iba na explicitne získaný zámok vo vnútri synchronizovaného bloku alebo metódy
  • Na rozdiel od výnos (), je možné počkať() určiť minimálne časové obdobie na čakanie pred akýmkoľvek pokusom o opätovné naplánovanie vlákna
  • S počkaj () vlákno je tiež možné kedykoľvek prebudiť vyvolaním súboru upozorniť () alebo notifyAll () na dotknutom objekte zámku

3.2. výnos () vs spánok ()

  • Zatiaľ čo výnos () môže vykonať iba heuristický pokus o pozastavenie vykonávania aktuálneho vlákna bez záruky, kedy bude naplánované späť, spánok () môže donútiť plánovača, aby pozastavil vykonávanie aktuálneho vlákna najmenej na uvedené časové obdobie ako jeho parameter.

3.3. výnos () vs pripojiť sa ()

  • Aktuálne vlákno sa môže vyvolať pripojiť sa () na akomkoľvek inom vlákne, ktoré spôsobí, že súčasné vlákno počká, kým druhé vlákno zomrie, než budete môcť pokračovať
  • Voliteľne môže ako parameter uviesť časové obdobie, ktoré označuje maximálny čas, po ktorý by malo súčasné vlákno čakať pred obnovením

4. Použitie pre výnos ()

Ako naznačuje oficiálna dokumentácia, použitie je zriedka potrebné výnos () a preto je potrebné sa im vyhnúť, pokiaľ nie sú veľmi jasné ciele vzhľadom na jeho správanie.

Napriek tomu niektoré z použitia pre výnos () zahŕňajú návrh konštrukcií riadenia súbežnosti, zlepšenie odozvy systému v náročnom programe atď.

Tieto spôsoby používania však musia byť sprevádzané podrobným profilovaním a porovnávaním, aby sa dosiahol požadovaný výsledok.

5. Záver

V tomto krátkom článku sme diskutovali o výnos () metóda v Závit triedy a videl jej správanie a obmedzenia prostredníctvom fragmentu kódu.

Preskúmali sme tiež jeho porovnanie s inými idiómami súbežnosti dostupnými v jazyku Java a nakoniec sme sa pozreli na niektoré prípady použitia výnos () môže byť užitočné.

Ako vždy, môžete si pozrieť príklady uvedené v tomto článku na stránkach GitHub.


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