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