Гибкий CountDownLatch?
Я дважды сталкивался с проблемой, когда поток-производитель создает N рабочих элементов, отправляет ихExecutorService
и затем необходимо дождаться, пока все N элементов будут обработаны.
Предостережения
N не известен заранее, Если бы это было так, я бы просто создалCountDownLatch
а потом есть продюсерская нитьawait()
пока все работы не были завершены.ИспользуяCompletionService
неуместно, потому что, хотя мой поток производителя должен блокироваться (то есть, вызываяtake()
) естьнет способа сообщить, что вся работа завершена, чтобы заставить поток производителя перестать ждать.Мое любимое решение - использовать счетчик целых чисел иприращение это всякий раз, когда предмет работы представлен идекремент это когда рабочий элемент обрабатывается. После выполнения всех N задач мой поток производителя должен будет ждать блокировки, проверяя,counter == 0
всякий раз, когда это уведомлено. Поток (и) потребителя должен будет уведомить производителя, если он уменьшил счетчик и новое значение равно 0.
Есть ли лучший подход к этой проблеме или есть подходящая конструкция вjava.util.concurrent
Я должен использовать, а не "катится самостоятельно "?
Заранее спасибо.