Подождите ровно n выполненных работ: производитель, потребитель и счетчик - PullRequest
0 голосов
/ 21 января 2011

Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть нить А, и нужно сделать n работ. Поток A должен ждать, пока эта работа не будет полностью завершена. Моя идея состоит в том, чтобы использовать CountDownLatch с n счетчиком и использовать шаблон производителя / потребителя для управления рабочим.

Я использую AtomicInteger в качестве счетчика: Производитель проверяет, больше ли значение счетчика, чем 0, затем подает сигнал на BlockingQueue, если значение счетчика меньше или равно 0, Производитель устанавливает stopSignal в очередь. Потребитель берет из очереди, проверяет, не равен ли сигнал stopSignal, затем использует ExecutorService, чтобы запланировать Worker.

Рабочий позвонит getAndDecrement и проверит, если значение счетчика больше 0, если да, тогда сделай работу, если работа выполнена, то она вызывает CountDownLatch # countdown, иначе счетчик увеличивается на incrementAndGet

Проблема в том, что когда работа не выполнена, рабочий должен увеличить счетчик, но это после getAndDecrement, чтобы производитель мог увидеть значение счетчика равным 0 и поставить сигнал остановки даже на общую сумму работы. меньше п!

1 Ответ

1 голос
/ 21 января 2011

Похоже, вы работаете над типичной проблемой производителя / потребителя с некоторой дополнительной сложностью (новое условие ожидания ровно n выполненной работы).Итак, как вы определили, у вас есть производители и потребители.Один делает работу, второй потребляет ее.

Увеличивается после создания работы.Уменьшается после того, как работа будет израсходована.При таком подходе ваши работники будут пытаться выбраться из очереди только при наличии доступной работы.

Теперь, чтобы решить вашу проблему, новое условие вас ожидает n работ, которые будут завершены.Если вы ожидаете завершения определенного количества заданий и четко знаете об этих заданиях, вы можете использовать объект CyclicBarrier , чтобы остановить поток, пока все задания не достигнут барьера.* Обычно есть два способа координировать работу двух работников в параллельной ситуации.Производитель / Потребитель может не быть решением этой проблемы, как и Барьер.Я бы порекомендовал заглянуть в пакет java.util.concurrent, поскольку он может пролить больше света на эту тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...