Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть поток A, и нужно выполнить n работ. Поток A должен ждать, пока эти n операций не будут полностью выполнены. Моя идея заключается в использовании CountDownLatch
со счетом n и использовании шаблона Producer/Consumer для управления Worker.
Я использую AtomicInteger
в качестве счетчика: Производитель проверяет, больше ли значение счетчика 0, затем помещает сигнал в BlockingQueue
, если значение счетчика меньше или равно 0, Производитель помещает стоп-сигнал в очередь. Потребитель берет из очереди, проверяет, не равен ли сигнал сигналу stopSignal, затем использует ExecutorService
для планирования Worker
.
Рабочий вызывает getAndDecrement
и проверяет, больше ли значение счетчика 0, если да, то выполняет работу, если работа выполнена, то вызывает CountDownLatch#countdown, иначе увеличивает счетчик с помощью incrementAndGet
Проблема в том, что когда работа не выполнена, рабочий должен увеличить счетчик, но это происходит после getAndDecrement
, поэтому производитель может увидеть, что значение счетчика равно 0, и поставить сигнал остановки, даже если общее количество работы меньше n!
join()
их все? Просто может быть. - person 9000   schedule 21.01.2011