2012-05-15 4 views
6

Ich brauche Hilfe, die Vorteile der Verwendung von CountDownLatch über traditionelle Warte-Benachrichtigung zu verstehen. Ich denke, notifyAll() tut in der Tat das gleiche, und es scheint einfacher zu verwenden (vielleicht wegen der Vertrautheit).Unterschied zwischen Warten-Benachrichtigen und CountDownLatch

Was ist der Unterschied zwischen wait() und await() von CountDownLatch?

Danke!

EDIT: Ich denke, ich brauche meine Fragen umformulieren:

Await() laut docs sagt:

der aktuelle Thread Ursachen zu warten, bis die Verriegelung bis auf Null gezählt hat , außer der Thread ist unterbrochen.

Für mich ist es schwer, den Unterschied zwischen wait() und warten() zu sehen - erwarten() ist in der Tat mit wait() unter Abdeckungen und scheint, gibt es eine implizite notifyAll(), wenn Zählung Null erreicht.

Was ich fragen wollte war, warum sollte ich nicht einfach einen wait-notifyAll() -Mechanismus (mit meiner eigenen Zählervariablenverarbeitung) verwenden, statt CountDownLatch zu verwenden?

+1

Hier ist ein offensichtlicher Unterschied ... wenn Thread B "notifyAll()" aufruft, bevor Thread A "wait()" aufruft, wartet Thread A für immer; Wenn jedoch Thread B "countDown()" aufruft, bevor Thread A "await()" aufruft, wird Thread A ohne Warten fortgesetzt. – yshavit

Antwort

9

Sie tun sicherlich nicht das Gleiche: CountDownLatch nur Signale, wenn die Ereignisanzahl 0 erreicht hat und es automatisch tut, wait-notify erfordert, dass Sie Ihre eigene Zählung behalten, wenn Sie das gleiche Verhalten erreichen möchten. Die Implementierung des gleichen Verhaltens ist oft fehleranfällig, und es ist am besten, dass Sie es vermeiden (vor allem, wenn Sie mit der Programmierung von Nebenläufigkeit nicht vertraut sind). Vergleicht man CountDownLatch und wait-notify ist kaum ein Vergleich von Äpfeln mit Orangen, es ist mehr vergleichbar mit einem automatischen Bohrer und einem Inbusschlüssel.

Ich weiß nicht, ob Sie notifyAll() und CountDownLatch verwendet haben, aber notifyAll() allein werden Sie nicht das gleiche Verhalten geben, wenn Sie Zahl gehalten haben, wie viele Ereignisse stattgefunden haben. CountDownLatch ist wahrscheinlich am besten geeignet, um eine festgelegte Anzahl von Aufgaben auszuführen und darauf zu warten, dass diese Aufgaben abgeschlossen sind, bevor Sie mit der Ausführung des restlichen Programms fortfahren. Es ist besonders hilfreich, wenn Sie eine feste Anzahl von Threads (z. B. ThreadPool) eine feste Anzahl von Aufgaben ausführen, aber Ihre Threads sind viel weniger als die Aufgaben und Sie müssen sie wiederverwenden. Mit einem CountDownLatch können Sie leicht warten, bis alle Aufgaben abgeschlossen sind. Ich weiß nicht, wie Sie notifyAll() verwendet haben, um das gleiche Verhalten zu erreichen, aber wenn Sie uns weitere Informationen zur Verfügung stellen, können wir uns mit einer der beiden befassen (es gibt sicherlich einige Fälle, in denen waitNotify() geeigneter ist) .

In Bezug auf den Unterschied zwischen wait() und await() bin ich etwas enttäuscht von dir! Mit Blick auf die Dokumentation up ist die erste Schritt einer Frage:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

await() ist eine tatsächliche Funktion von CountDownLatch während wait() aus Object geerbt. Ich würde empfehlen, dass Sie die Dokumentation für das, was sie tun, überprüfen.

+0

Sie sollten wahrscheinlich aktuelle Dokumentation –

+0

@HunterMcMillen ah, ja ... das ist eine gute Idee:) ... (aktualisiert die Dokumentation) – Kiril

+0

Was meinst du "ThreadPool Ausführen einer festen Anzahl von Aufgaben, aber Ihre Threads sind viel weniger als die Aufgaben und Sie müssen sie wiederverwenden ", wie n Threads zu implementieren, m Aufgaben (n coderz