1350 Stimmen

Unterschied zwischen "wait()" vs "sleep()" in Java

Was ist der Unterschied zwischen einem wait() und sleep() in Threads?

Ist mein Verständnis richtig, dass ein wait()-ender Thread sich immer noch im Laufmodus befindet und CPU-Zyklen verwendet, während ein sleep()-ender Thread keine CPU-Zyklen verbraucht?

Warum haben wir beide wait() und sleep()?

Wie unterscheidet sich deren Implementierung auf niedrigerer Ebene?

61 Stimmen

Sehr gute Frage. Die Semantik beider ist leicht zu verwechseln.

1 Stimmen

Sehr gute Fragen, aber sie sind 2 in einem. Warum wir beide haben, ist nicht dasselbe wie wie sie auf einer niedrigeren Ebene implementiert werden können (und nicht sind!). Darauf habe ich auch geantwortet.

0 Stimmen

Angenommen ein Thread A befindet sich in einem synchronisierten Block, und während er in der CPU ist, wird dieser Thread einem anderen Thread B übergeben. In welchem Zustand wird Thread A jetzt sein? Werden die anderen Threads, die auf diesem synchronisierten Block warten, jetzt eintreten?

4voto

VeKe Punkte 8993
  1. wait() ist eine Methode der Object Klasse.
    sleep() ist eine Methode der Thread Klasse.

  2. sleep() ermöglicht es dem Thread, für x Millisekunden in den Schlafzustand zu gehen.
    Wenn ein Thread in den Schlafzustand wechselt, gibt er das Schloss nicht frei.

  3. wait() ermöglicht es dem Thread, das Schloss freizugeben und in den ausgesetzten Zustand zu wechseln.
    Dieser Thread wird aktiv, wenn für dasselbe Objekt eine notify() oder notifAll() Methode aufgerufen wird.

4voto

Mark Punkte 41

Ein potenzieller großer Unterschied zwischen sleep/interrupt und wait/notify ist, dass

Das Generieren einer Ausnahme, wenn nicht erforderlich, ist ineffizient. Wenn Threads häufig miteinander kommunizieren, würde es viele Ausnahmen erzeugen, wenn Sie immerzu interrupt aufrufen, was eine totale Verschwendung von CPU-Ressourcen wäre.

0 Stimmen

+1, Ein gültiger Punkt tatsächlich, obwohl die Argumentation über die Interna von Implementierungen möglicherweise relevanter für die Leistungsanalyse ist...

0 Stimmen

Mit anderen Worten könnte der Overhead bei der Erstellung von Ausnahmen wesentlich geringer sein als der Overhead bei der Implementierung des Systems von einem im Vergleich zum anderen.

4voto

Rakhi Jaligama Punkte 41

Hier wird wait() im Wartezustand verweilen, bis es von einem anderen Thread benachrichtigt wird, während sleep() eine bestimmte Zeit hat... danach wird es automatisch in den Bereitschaftszustand übergehen...

3voto

VISALIG Punkte 27

Unterschiede zwischen Wait() und Sleep()?

Thread.sleep() Sobald seine Arbeit abgeschlossen ist, gibt es den Lock nur dann für alle frei. Bis dahin gibt es den Lock nie für jemanden frei.

  Sleep() nimmt den Schlüssel, gibt ihn nie an irgendjemanden frei, wenn seine Arbeit abgeschlossen ist, gibt er ihn nur frei und nimmt dann nur den Schlüssel von Threads im Wartezustand.

Object.wait() Wenn er in den Wartezustand geht, lässt er den Schlüssel frei und wartet einige Sekunden basierend auf dem Parameter.

Zum Beispiel:

Sie halten den Kaffee in Ihrer rechten Hand, Sie können einen anderen von gleicher Hand nehmen, wenn Sie ihn ablegen, nehmen Sie erst dann ein gleiches Objekt hier. Ebenfalls. Das ist sleep(), in Ihrer Schlafzeit machen Sie keine Arbeit, Sie schlafen nur... genauso hier auch.

wait(). Wenn Sie etwas ablegen und ein anderes nehmen, während Sie warten, das ist wait

Sie schauen einen Film oder irgendetwas auf Ihrem System, genau wie ein Player können Sie nicht mehr als einen zur gleichen Zeit abspielen, hier ist es dasselbe, wenn Sie schließen und ein anderes Video oder Lied wählen, ist es in der Zwischenzeit warten.

3voto

KarlP Punkte 5059

Die Methoden werden für unterschiedliche Zwecke verwendet.

Thread.sleep(5000);   // Warte, bis die Zeit vergangen ist.

Object.wait();        // Warte, bis ein anderer Thread mich aufweckt.

Thread.sleep(n) kann unterbrochen werden, aber Object.wait() muss benachrichtigt werden. Es ist möglich, die maximale Wartezeit anzugeben: Object.wait(5000), so dass es möglich wäre, wait zu verwenden, um, äh, zu sleep, aber dann müssten Sie sich mit Sperren beschäftigen.

Keine der Methoden verwendet die CPU während des Schlafens/Wartens.

Die Methoden werden unter Verwendung von nativem Code implementiert, der ähnliche Strukturen verwendet, aber nicht auf dieselbe Weise.

Schau selbst nach: Is the source code of native methods available? Die Datei /src/share/vm/prims/jvm.cpp ist der Ausgangspunkt...

0 Stimmen

Thread.sleep timing kann auch auf unbestimmt gesetzt werden. Object.wait timing kann auch auf bestimmt gesetzt werden. Diese Antwort erklärt nicht, warum wir 2 Hämmer brauchen, die dasselbe tun.

0 Stimmen

Thread.sleep(große_num) muss unterbrochen werden. Object.wait(kleine_num) kann benachrichtigt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X