Verschil tussen wachten en slapen in Java

1. Overzicht

In dit korte artikel zullen we de standaard bekijken slaap() en wacht() methoden in core Java, en begrijp de verschillen en overeenkomsten daartussen.

2. Algemene verschillen tussen Wacht en Slaap

Simpel gezegd, wacht() is een instantiemethode die wordt gebruikt voor threadsynchronisatie.

Het kan op elk object worden aangeroepen, aangezien het direct is gedefinieerd java.lang.Object, maar het kan alleen worden aangeroepen vanuit een gesynchroniseerd blok. Het maakt de vergrendeling op het object los, zodat een andere draad erin kan springen en een vergrendeling kan krijgen.

Aan de andere kant, Thread.sleep () is een statische methode die vanuit elke context kan worden aangeroepen.Thread.sleep () pauzeert de huidige thread en geeft geen vergrendelingen vrij.

Hier is een zeer simplistische eerste blik op deze twee kern-API's in actie:

privé statisch object LOCK = nieuw object (); privé statische leegte sleepWaitExamples () gooit InterruptedException {Thread.sleep (1000); System.out.println ("Thread '" + Thread.currentThread (). GetName () + "' wordt gewekt na 1 seconde slapen"); gesynchroniseerd (LOCK) {LOCK.wait (1000); System.out.println ("Object '" + LOCK + "' wordt gewekt na" + "wachten op 1 seconde"); }} 

Als u dit voorbeeld uitvoert, krijgt u de volgende uitvoer:

Thread ‘main 'wordt gewekt na 1 seconde slapen

Object ‘[e-mail beschermd] 'wordt gewekt na 1 seconde wachten

3. Wakker worden Wacht en Slaap

Wanneer we de slaap() methode, wordt een thread gestart na een opgegeven tijdsinterval, tenzij deze wordt onderbroken.

Voor wacht()is het ontwaken iets gecompliceerder. We kunnen de thread wakker maken door ofwel de melden () of informerenAll () methoden op de monitor waarop wordt gewacht.

Gebruik informerenAll () in plaats van melden () wanneer u alle threads in de wachtstand wilt wekken. Net als bij de wacht() methode zelf, melden (), en informerenAll () moeten worden aangeroepen vanuit de gesynchroniseerde context.

Dit is bijvoorbeeld hoe u dat kunt doen wacht:

synchronized (b) {while (b.sum == 0) {System.out.println ("Wachten tot ThreadB klaar is ..."); b.wait (); } System.out.println ("ThreadB is voltooid." + "Som van die thread is:" + b.sum); }

En dan, hier is hoe een andere draad dan kan maak de wachtende draad wakker - door te bellen melden () op de monitor:

int som; @Override public void run () {gesynchroniseerd (dit) {int i = 0; while (i <100000) {som + = i; i ++; } melden (); }}

Als u dit voorbeeld uitvoert, krijgt u de volgende uitvoer:

Wachten tot ThreadB is voltooid ...

ThreadB is voltooid. Som van die thread is: 704982704

4. Conclusie

Dit is een snelle inleiding tot de semantiek van wacht en slaap in Java.

Over het algemeen zouden we moeten gebruiken slaap() voor het regelen van de uitvoeringstijd van één thread en wacht() voor multi-thread-synchronisatie. Natuurlijk valt er nog veel meer te ontdekken - nadat u de basis goed hebt begrepen.

Zoals altijd kun je de voorbeelden in dit artikel bekijken op GitHub.


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