Rozdiel medzi čakaním a spánkom v Jave

1. Prehľad

V tomto krátkom článku sa pozrieme na štandard spánok () a počkaj () metód v základnej Jave a porozumieť rozdielom a podobnostiam medzi nimi.

2. Všeobecné rozdiely medzi Počkaj a Spať

Jednoducho povedané, počkaj () je inštančná metóda, ktorá sa používa na synchronizáciu vlákien.

Dá sa vyvolať na akýkoľvek objekt, tak ako je to definované priamo na java.lang.Object, ale môže možno volať iba zo synchronizovaného bloku. Uvoľní zámok na objekte, aby mohlo skočiť ďalšie vlákno a získať zámok.

Na druhej strane, Thread.sleep () je statická metóda, ktorú je možné vyvolať z ľubovoľného kontextu.Thread.sleep () pozastaví aktuálne vlákno a neuvoľní žiadne zámky.

Tu je veľmi zjednodušený úvodný pohľad na tieto dve základné API v akcii:

súkromný statický objekt LOCK = nový objekt (); private static void sleepWaitExamples () hodí InterruptedException {Thread.sleep (1000); System.out.println ("Thread '" + Thread.currentThread (). GetName () + "' sa prebudí po spánku na 1 sekundu"); synchronizované (LOCK) {LOCK.wait (1000); System.out.println ("Objekt '" + LOCK + "' sa prebudí po" + "čakaní na 1 sekundu"); }} 

Spustenie tohto príkladu spôsobí nasledujúci výstup:

Niť „main“ sa prebudí po spánku po dobu 1 sekundy

Objekt „[chránený e-mailom]“ sa prebudí po čakaní na 1 sekundu

3. Prebudenie Počkaj a Spať

Keď použijeme spánok () metóda, vlákno sa spustí po určenom časovom intervale, pokiaľ nie je prerušené.

Pre počkaj (), proces prebudenia je o niečo komplikovanejší. Vlákno môžeme prebudiť zavolaním buď upozorniť () alebo notifyAll () metódy na monitore, na ktorý sa čaká.

Použite notifyAll () namiesto upozorniť () keď chcete prebudiť všetky vlákna, ktoré sú v stave čakania. Podobne ako počkaj () samotná metóda, upozorniť ()a notifyAll () musia byť vyvolané zo synchronizovaného kontextu.

Tu je príklad, ako môžete počkaj:

synchronized (b) {while (b.sum == 0) {System.out.println ("Čaká sa na dokončenie ThreadB ..."); b.wait (); } System.out.println ("ThreadB bol dokončený." + "Súčet z tohto vlákna je:" + b.sum); }

A potom, tu je, ako môže potom iné vlákno prebudiť čakajúce vlákno - zavolaním upozorniť () na monitore:

int suma; @Override public void run () {synchronized (this) {int i = 0; while (i <100000) {sum + = i; i ++; } oznámiť (); }}

Spustenie tohto príkladu spôsobí nasledujúci výstup:

Čaká sa na dokončenie ThreadB ...

Vlákno B bolo dokončené. Súčet z tohto vlákna je: 704982704

4. Záver

Toto je rýchly základ sémantiky výrazu počkaj a spať v Jave.

Všeobecne by sme mali používať spánok () na riadenie času vykonania jedného vlákna a počkaj () pre viacvláknovú synchronizáciu. Prirodzene, je tu ešte veľa toho, čo treba preskúmať - po dobrom pochopení základných informácií.

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