天天看點

java 消費者生産模式_Java中的 生産環境 者/消費者模式

我正在考慮如何在Java中實作 生産環境 者/消費者模式 .

假設我有3個線程和一個包含任務的List(比如它是大約5個任務) . 每個線程從清單中擷取任務并同時執行它 . 我目前的方法是使用CountDownLatch

int N = 3;

CountDownLatch startSignal = new CountDownLatch(1);

CountDownLatch doneSignal = new CountDownLatch(N);

ConcurrentLinkedQueue tasks = new ConcurrentLinkedQueue();

main() {

for (int i=0;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的唯一方法嗎?