Я думаю, как реализовать паттерн производитель/потребитель в Java.
Предположим, что у меня есть 3 потока и список, содержащий задачи (скажем, около 5 задач). Каждый поток берет задачу из списка и выполняет ее одновременно. Мой текущий подход заключается в использовании CountDownLatch
int N = 3;
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(N);
ConcurrentLinkedQueue<String> tasks = new ConcurrentLinkedQueue<String>();
main() {
for (int i=0;i<N;i++) {
new Thread(new Worker()).start();
}
startSignal.countDown();
doneSignal.await();
System.out.println("done");
}
class Worker implements Runnable {
public void run() {
startSignal.await();
while ((s = tasks.poll()) != null) {
// do lengthy task here
if (task failed) {
tasks.add(s);
return; // assume that task fails badly and have to stop the thread
}
}
doneSignal.countDown();
}
}
чего я хотел добиться, так это того, что если поток терпит неудачу при обработке задачи, он будет добавлен обратно в список задач для повторного выбора текущим или любым другим потоком, но с моим текущим подходом с использованием CountDownLatch, очевидно, невозможно сделайте это, потому что после вызова doneSignal.countDown() поток предполагает, что он уже завершил задачу.
Что было бы лучшим подходом для этого сценария? Является ли использование Executor единственным способом?