2012-05-15 10 views
6

Potrzebuję pomocy w zrozumieniu zalet używania CountDownLatch zamiast tradycyjnego wait-notify. Myślę, że funkcja notifyAll() rzeczywiście robi to samo i wydaje się łatwiejsza w użyciu (może ze względu na znajomość).Różnica między oczekiwaniem-zapowiedzią a CountDownLatch

Jaka jest różnica między oczekiwaniem() a oczekiwaniem() z CountDownLatch?

Dzięki!

EDIT: Chyba trzeba przeformułować swoje zapytania:

czekają() zgodnie z docs mówi:

Powoduje bieżący wątek do czekać aż zatrzask jest odliczany do zera , chyba że wątek zostanie przerwany.

Dla mnie trudno dostrzec różnicę między wait() i czekają() - czekają() jest rzeczywiście za pomocą wait() pod osłonami, i wydaje się, że jest niejawna notifyAll(), gdy licznik osiągnął zero.

Chciałem zapytać, dlaczego nie powinienem po prostu użyć mechanizmu wait-notifyAll() (z moim własnym przetwarzaniem licznika), zamiast używać CountDownLatch?

+1

Oto jedna oczywista różnica ... jeśli wątek B nazywa 'notifyAll()' zanim wątek A wywoła 'wait()', wątek A będzie czekać na zawsze; ale jeśli wątek B wywołuje 'countDown()' zanim wątek A wywoła 'await()', wątek A będzie kontynuowany bez oczekiwania. – yshavit

Odpowiedz

9

Z pewnością nie robią tego samego: CountDownLatch sygnalizuje tylko kiedy licznik zdarzeń osiągnie 0 i robi to automatycznie, wait-notify wymaga, abyś utrzymywał swój własny licznik, jeśli chcesz osiągnąć to samo zachowanie. Wdrożenie tego samego zachowania jest często podatne na błędy i najlepiej go unikać (szczególnie, jeśli jesteś nowy w programowaniu współbieżności). Porównywanie CountDownLatch i wait-notify prawie nie jest porównywaniem jabłek do pomarańczy, to raczej porównanie automatycznej wiertarki i klucza imbusowego.

ja nie wiem, czy użyłeś notifyAll() i CountDownLatch, ale notifyAll() sam nie daje takie samo zachowanie chyba że trzymane rachubę jak doszło wiele imprez. CountDownLatch jest prawdopodobnie najbardziej odpowiedni do wykonywania określonej liczby zadań i oczekiwania na wykonanie tych zadań przed wznowieniem wykonywania reszty programu. Jest to szczególnie przydatne, gdy masz stałą liczbę wątków (np. ThreadPool) wykonujących określoną liczbę zadań, ale twoje wątki są o wiele mniejsze niż zadania i musisz je ponownie wykorzystać. Dzięki CountDownLatch można łatwo czekać na zakończenie wszystkich zadań. Nie wiem, w jaki sposób używasz notifyAll(), aby osiągnąć to samo zachowanie, ale jeśli podasz nam więcej informacji, możemy odpowiedzieć, który z nich jest lepszym wyborem (na pewno są pewne przypadki, w których bardziej odpowiednie jest ustawienie waitNotify()) .

Jeśli chodzi o różnicę między wait() a await(), jestem nieco rozczarowany! Patrząc na dokumentację krok jest jednym z każdej kwestii:

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

await() jest rzeczywista funkcja CountDownLatch natomiast wait() jest dziedziczona z Object. Zaleciłbym sprawdzenie dokumentacji dotyczącej tego, co robią.

+0

Powinieneś prawdopodobnie opublikować bieżącą dokumentację –

+0

@HunterMcMillen ah, tak ... to jest dobry pomysł:) ... (zaktualizowano dokumentację) – Kiril

+0

Co masz na myśli mówiąc "ThreadPool wykonując określoną liczbę zadań, ale twoje wątki są o wiele mniejsze niż zadania i musisz ich ponownie użyć ", jak zaimplementować n wątków do m zadań (n coderz