В Java не может определить, когда несколько производителей / потребителей завершили - PullRequest
1 голос
/ 14 ноября 2011

Имеют шаблон потребителя с несколькими производителями, производитель1 -> потребитель1 / производитель2 -> потребитель2 / производитель 3, каждый производитель использует услугу завершения, но у меня возникают проблемы при кодировании логики для работы после ее завершения.

проблема состоит в том, что main ставит некоторые (x) задачи в очередь производителей 1, это, в свою очередь, заставляет производителя 1 ставить (y) задачи для производителя 2, а производитель 2 ставит z задач для производителя 3. x, y и z различныпоэтому main не может просто посмотреть на очередь завершения производителя 3 и взять z фьючерсы, потому что main не знает z.

Итак, я попробовал идею отравленной таблетки вместе с CountDownLatch, инициализированным на 3, main знает, что у производителя 1 есть только x задач, поэтому я могу подать отравленную таблетку в конце, затем, когда производитель 1 получит это, он сможетуменьшите защелку и отправьте ядовитую таблетку производителю 2, и производитель 2 получит одну, она уменьшит, зафиксирует отправленную таблетку производителю 3. Когда производитель 3 получит ее, она уменьшит защелку.main просто выполняет countdownlatch.await () и не сможет продолжить работу, пока все задачи не будут выполнены.Но это работает только в том случае, если каждая служба-исполнитель ограничена одним потоком, потому что, когда производитель получает отравленную таблетку, это означает, что все предыдущие задачи были запущены, а не выполнены.

Так как мне обойти это,Я думаю, что, должно быть, упускаю более простое решение где-то вдоль линии.

1 Ответ

0 голосов
/ 14 ноября 2011

Вы можете выключить и дождаться окончания каждого executorService по очереди.

ExecutorService[] services = { executor1, executor2, executor3 };
for(ExecutorService service: services) {
    service.shutdown();
    service.awaitTermination(1, TimeUnit.MINUTES);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...