Forskjellen mellom vent og søvn i Java

1. Oversikt

I denne korte artikkelen ser vi på standarden søvn() og vente() metoder i kjernen Java, og forstå forskjellene og likhetene mellom dem.

2. Generelle forskjeller mellom Vente og Søvn

For å si det enkelt, vente() er en forekomstmetode som brukes til trådsynkronisering.

Det kan kalles på et hvilket som helst objekt, slik det er definert rett på java.lang.Object, men det kan bare ringes fra en synkronisert blokk. Den frigjør låsen på objektet slik at en annen tråd kan hoppe inn og skaffe seg en lås.

På den andre siden, Thread.sleep () er en statisk metode som kan kalles fra hvilken som helst kontekst.Thread.sleep () pauser gjeldende tråd og frigjør ingen låser.

Her er en veldig forenklet innledende titt på disse to kjerne-API-ene i aksjon:

privat statisk objekt LÅS = nytt objekt (); privat statisk tomrom sleepWaitExamples () kaster InterruptedException {Thread.sleep (1000); System.out.println ("Thread '" + Thread.currentThread (). GetName () + "' er vekket etter å ha sovet i 1 sekund"); synkronisert (LOCK) {LOCK.wait (1000); System.out.println ("Object '" + LOCK + "' er vekket etter" + "venter i 1 sekund"); }} 

Å kjøre dette eksemplet vil gi følgende utdata:

Tråden ‘main’ vekkes etter å ha sovet i 1 sekund

Objektet ‘[e-postbeskyttet]’ blir vekket etter å ha ventet i 1 sekund

3. Å våkne Vente og Søvn

Når vi bruker søvn() metode, kommer en tråd i gang etter et spesifisert tidsintervall, med mindre den blir avbrutt.

Til vente(), er oppvåkningsprosessen litt mer komplisert. Vi kan vekke tråden ved å ringe enten gi beskjed() eller notifyAll () metoder på skjermen som det ventes på.

Bruk notifyAll () i stedet for gi beskjed() når du vil vekke alle tråder som er i ventetilstand. På samme måte som vente() selve metoden, gi beskjed(), og notifyAll () må kalles fra den synkroniserte konteksten.

For eksempel, her er hvordan du kan vente:

synkronisert (b) {while (b.sum == 0) {System.out.println ("Waiting for ThreadB to complete ..."); b.wait (); } System.out.println ("ThreadB har fullført." + "Summen fra den tråden er:" + b.sum); }

Og så, her er hvordan en annen tråd kan da vekke ventetråden - ved å ringe gi beskjed() på skjermen:

int sum; @ Override public void run () {synkronisert (dette) {int i = 0; mens (i <100000) {sum + = i; i ++; } gi beskjed(); }}

Å kjøre dette eksemplet vil gi følgende utdata:

Venter på at ThreadB skal fullføres ...

ThreadB har fullført. Sum fra den tråden er: 704982704

4. Konklusjon

Dette er en rask primer til semantikken til vente og søvn i Java.

Generelt sett bør vi bruke søvn() for å kontrollere utførelsestiden for en tråd og vente() for synkronisering med flere tråder. Naturligvis er det mye mer å utforske - etter å ha forstått det grunnleggende godt.

Som alltid kan du sjekke eksemplene i denne artikkelen på GitHub.