Unterschied zwischen Wait und Sleep in Java

Unterschied zwischen Warten und Schlafen in Java

1. Überblick

In diesem kurzen Artikel werden wir uns die Standardmethodensleep() undwait() in Kern-Java ansehen und die Unterschiede und Ähnlichkeiten zwischen ihnen verstehen.

2. Allgemeine Unterschiede zwischenWait undSleep

Einfach ausgedrückt,wait() is an instance method that’s used for thread synchronization.

Es kann für jedes Objekt aufgerufen werden, wie es direkt fürjava.lang.Object, definiert ist, aber es kannonly be called from a synchronized block. Dadurch wird die Sperre für das Objekt aufgehoben, sodass ein anderer Thread hineinspringen und eine Sperre erwerben kann.

Andererseits istThread.sleep() eine statische Methode, die aus jedem Kontext aufgerufen werden kann. Thread.sleep() pauses the current thread and does not release any locks.

Hier ein sehr vereinfachter erster Blick auf diese beiden Kern-APIs in Aktion:

private static Object LOCK = new Object();

private static void sleepWaitExamples()
  throws InterruptedException {

    Thread.sleep(1000);
    System.out.println(
      "Thread '" + Thread.currentThread().getName() +
      "' is woken after sleeping for 1 second");

    synchronized (LOCK) {
        LOCK.wait(1000);
        System.out.println("Object '" + LOCK + "' is woken after" +
          " waiting for 1 second");
    }
}

Das Ausführen dieses Beispiels erzeugt die folgende Ausgabe:

Der Thread 'main' wird nach 1 Sekunde Schlaf geweckt Das Objekt '[email protected]' wird nach 1 Sekunde Wartezeit geweckt

3. Wait undSleep aufwachen

Wenn wir die Methodesleep() verwenden, wird ein Thread nach einem bestimmten Zeitintervall gestartet, sofern er nicht unterbrochen wird.

Fürwait() ist der Aufwachvorgang etwas komplizierter. Wir können den Thread aktivieren, indem wir entweder die Methodennotify() odernotifyAll() auf dem Monitor aufrufen, auf den gewartet wird.

Verwenden SienotifyAll() anstelle vonnotify(), wenn Sie alle Threads aktivieren möchten, die sich im Wartezustand befinden. Ähnlich wie bei derwait()-Methode selbst müssennotify() undnotifyAll() aus dem synchronisierten Kontext aufgerufen werden.

So können Sie beispielsweisewait:

synchronized (b) {
    while (b.sum == 0) {
        System.out.println("Waiting for ThreadB to complete...");
        b.wait();
    }

    System.out.println("ThreadB has completed. " +
      "Sum from that thread is: " + b.sum);
}

Und dann, so kann ein anderer Thread dannwake up the waiting thread – by calling notify() on the monitor:

int sum;

@Override
public void run() {
    synchronized (this) {
        int i = 0;
        while (i < 100000) {
            sum += i;
            i++;
        }
        notify();
    }
}

Das Ausführen dieses Beispiels erzeugt die folgende Ausgabe:

Waiting for ThreadB to complete…ThreadB has completed. Summefrom that thread is: 704982704

4. Fazit

Dies ist eine kurze Einführung in die Semantik vonwait undsleep in Java.

Im Allgemeinen sollten wirsleep() zur Steuerung der Ausführungszeit eines Threads undwait() für die Multithread-Synchronisation verwenden. Natürlich gibt es noch viel mehr zu entdecken - nachdem Sie die Grundlagen gut verstanden haben.

Wie immer können Sie die Beispiele in diesem Artikelover on GitHub lesen.