Razlika između čekanja i spavanja u Javi

1. Pregled

U ovom ćemo kratkom članku pogledati standard spavati() i čekati() metode u jezgri Java i razumiju razlike i sličnosti među njima.

2. Opće razlike između Čekati i Spavati

Jednostavno rečeno, čekati() je metoda instance koja se koristi za sinkronizaciju niti.

Može se pozvati na bilo kojem objektu, kako je točno definirano java.lang.Object, ali može poziva se samo iz sinkroniziranog bloka. Oslobađa bravu na objektu tako da druga nit može uskočiti i steći bravu.

S druge strane, Thread.sleep () je statična metoda koja se može pozvati iz bilo kojeg konteksta.Thread.sleep () zaustavlja trenutnu nit i ne oslobađa nikakve brave.

Evo vrlo jednostavnog početnog uvida u ova dva osnovna API-ja na djelu:

privatni statički objekt LOCK = novi objekt (); privatna statička praznina sleepWaitExamples () baca InterruptedException {Thread.sleep (1000); System.out.println ("Thread '" + Thread.currentThread (). GetName () + "' se budi nakon spavanja 1 sekunde"); sinkronizirano (LOCK) {LOCK.wait (1000); System.out.println ("Objekt '" + LOCK + "' se budi nakon što" + "čeka 1 sekundu"); }} 

Pokretanje ovog primjera proizvest će sljedeći izlaz:

Nit 'main' se budi nakon spavanja 1 sekunde

Objekt ‘[e-pošta zaštićena]’ probudi se nakon čekanja od 1 sekunde

3. Buđenje Čekati i Spavati

Kada koristimo spavati() metoda, nit započinje nakon određenog vremenskog intervala, osim ako nije prekinuta.

Za čekati(), postupak buđenja je malo složeniji. Nit možemo probuditi pozivanjem bilo obavijestiti() ili notifyAll () metode na monitoru na koji se čeka.

Koristiti notifyAll () umjesto obavijestiti() kada želite probuditi sve niti koje su u stanju čekanja. Slično kao čekati() sama metoda, obavijestiti(), i notifyAll () moraju biti pozvani iz sinkroniziranog konteksta.

Na primjer, evo kako možete čekati:

sinkronizirano (b) {while (b.sum == 0) {System.out.println ("Čekanje da se ThreadB dovrši ..."); b.čekaj (); } System.out.println ("ThreadB je dovršen." + "Zbroj iz te niti je:" + b.sum); }

A onda, evo kako onda može druga nit probudite nit čekanja - pozivom obavijestiti() na monitoru:

int zbroj; @Preuzmi javnu void run () {sinkronizirano (ovo) {int i = 0; dok je (i <100000) {zbroj + = i; i ++; } obavijestiti(); }}

Pokretanje ovog primjera proizvest će sljedeći izlaz:

Čekanje da se ThreadB dovrši ...

ThreadB je dovršen. Iznos iz te niti je: 704982704

4. Zaključak

Ovo je kratki priručnik za semantiku čekati i spavati na Javi.

Općenito, trebali bismo koristiti spavati() za kontrolu vremena izvršavanja jedne niti i čekati() za sinkronizaciju s više niti. Naravno, ima još puno toga za istražiti - nakon što ste dobro razumjeli osnove.

Kao i uvijek, primjere iz ovog članka možete pogledati na GitHubu.