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