Forskellen mellem vent og søvn i Java

1. Oversigt

I denne korte artikel vil vi se på standarden søvn() og vente() metoder i core Java, og forstå forskellene og lighederne mellem dem.

2. Generelle forskelle mellem Vente og Søvn

Kort fortalt, vente() er en instansmetode, der bruges til trådsynkronisering.

Det kan kaldes på ethvert objekt, som det er defineret lige den java.lang. objekt, men det kan kun kaldes fra en synkroniseret blok. Det frigør låsen på objektet, så en anden tråd kan hoppe ind og få en lås.

På den anden side, Thread.sleep () er en statisk metode, der kan kaldes fra enhver kontekst.Thread.sleep () sætter den aktuelle tråd på pause og frigør ingen låse.

Her er et meget forenklet indledende kig på disse to centrale API'er i aktion:

privat statisk objekt LOCK = nyt objekt (); privat statisk ugyldigt sleepWaitExamples () kaster InterruptedException {Thread.sleep (1000); System.out.println ("Tråd '" + Tråd.strømTråd (). GetName () + "' vækkes efter at have sovet i 1 sekund"); synkroniseret (LOCK) {LOCK.wait (1000); System.out.println ("Objekt '" + LOCK + "' vækkes efter" + "venter i 1 sekund"); }} 

At køre dette eksempel vil producere følgende output:

Tråd 'main' vækkes efter at have sovet i 1 sekund

Objekt '[email protected]' vækkes efter at have ventet i 1 sekund

3. Vågner op Vente og Søvn

Når vi bruger søvn() metode, begynder en tråd efter et bestemt tidsinterval, medmindre den afbrydes.

Til vente(), er opvågningsprocessen lidt mere kompliceret. Vi kan vække tråden ved at ringe til enten underrette() eller notifyAll () metoder på skærmen, som ventes på.

Brug notifyAll () i stedet for underrette() når du vil vække alle tråde, der er i ventetilstand. På samme måde som vente() selve metoden, underrette()og notifyAll () skal kaldes fra den synkroniserede kontekst.

For eksempel, her er hvordan du kan vente:

synkroniseret (b) {while (b.sum == 0) {System.out.println ("Waiting for ThreadB to complete ..."); b.vente (); } System.out.println ("ThreadB er afsluttet." + "Summen fra den tråd er:" + b.sum); }

Og så, her er hvordan en anden tråd kan så Vågn den ventende tråd op - ved at ringe underrette() på skærmen:

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

At køre dette eksempel producerer følgende output:

Venter på, at ThreadB er afsluttet ...

ThreadB er afsluttet. Sum fra den tråd er: 704982704

4. Konklusion

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

Generelt skal vi bruge søvn() til styring af udførelsestid for en tråd og vente() til synkronisering med flere tråde. Naturligvis er der meget mere at udforske - efter at have forstået det grundlæggende godt.

Som altid kan du tjekke eksemplerne i denne artikel på GitHub.


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