Javaでプロデューサ/コンシューマパターンを実装する方法を考えています。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を唯一の方法で使用していますか?
Hmm ..だから、ExecutorServiceが唯一の方法だと思います。私がCountDownLatchを使用している理由は、実際には のようなものを実行する予定です。while(未完了){3つのスレッドを作成して実行} ' だから、すべてのスレッドが実際に作業を完了してから次のステップ – GantengX
タスクを実行するときにスレッドが失敗した場合、ExecutorServiceはタスクを別のスレッドに渡すことができますか? – GantengX
Callableを使用して未来のものを入手し、回答が来るのを待って、簡単にタイムアウトすることもできます。 –