2012-05-15 2 views
6

Мне нужна помощь в понимании преимуществ использования CountDownLatch над традиционным уведомлением о ожидании. Я думаю, что notifyAll() действительно делает то же самое, и это кажется более простым в использовании (возможно, из-за знакомства).Разница между wait-notify и CountDownLatch

Кроме того, в чем разница между wait() и wait() от CountDownLatch?

Спасибо!

EDIT: Я думаю, мне нужно перефразировать мои запросы:

ОЖИДАНИЕ() согласно документации говорит:

Вызывает текущий поток ждать, пока защелка не отсчитывали до нуля , если поток не прерывается.

Для меня это трудно увидеть разницу между ожиданием() и ждать() - ждать() действительно используя ожидание() под кожухами, и, кажется, есть неявное notifyAll(), когда счетчик достигнет нуля.

Что я хотел спросить, почему я не должен просто использовать механизм wait-notifyAll() (с моей обработкой переменной счетчика), а не для CountDownLatch?

+1

Вот одна очевидная разница ... если поток B вызывает 'notifyAll()' перед потоком A вызывает 'wait()', поток A будет ждать вечно; но если поток B называет 'countDown()' перед потоком A вызывает 'await()', поток A будет продолжаться, не ожидая. – yshavit

ответ

9

Они, конечно же, не делают то же самое: CountDownLatch сигнализирует только, когда количество событий достигло 0, и это делается автоматически, wait-notify требует, чтобы вы сохраняли свой собственный счет, если хотите достичь такого же поведения. Внедрение такого же поведения часто подвержено ошибкам, и лучше всего избегать его (особенно если вы новичок в программировании параллелизма). Сравнивая CountDownLatch и wait-notify, вряд ли даже сравнение яблок с апельсинами, это скорее похоже на автоматическое сверление и гаечный ключ.

Я не знаю, если вы использовали notifyAll() и CountDownLatch, но notifyAll() в одиночку не даст вам такое же поведение, если вы не держали счет того, как произошло много событий. CountDownLatch, вероятно, наиболее подходит для выполнения фиксированного количества задач и ожидания завершения этих задач, прежде чем вы возобновите выполнение остальной части вашей программы. Это особенно полезно, когда у вас есть фиксированное количество потоков (например, ThreadPool), выполняющих фиксированное количество задач, но ваши потоки намного меньше задач, и вы должны их повторно использовать. С CountDownLatch вы можете легко дождаться завершения всех задач. Я не знаю, как вы использовали notifyAll() для достижения такого же поведения, но если вы предоставите нам дополнительную информацию, мы сможем решить, какой из двух является лучшим выбором (есть, конечно, некоторые случаи, когда более подходит waitNotify()) ,

Относительно разницы между wait() и await(), я несколько разочарован в вас! Подняв документацию ступенчато один любой вопрос:

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

await() является актуальной функцией CountDownLatch тогда wait() наследуется от Object. Я бы рекомендовал вам проверить документацию на то, что они делают.

+0

Возможно, вам стоит опубликовать текущую документацию –

+0

@HunterMcMillen ah, да ... это хорошая идея:) ... (обновлена ​​документация) – Kiril

+0

Что значит «ThreadPool» выполняет фиксированное количество задач, но ваши потоки намного меньше чем задачи, и вы должны их повторно использовать », как реализовать n потоков выполнить m задач (n coderz

Смежные вопросы