2011-01-21 6 views
0

私が直面する問題は、スレッドAとnの作業が必要です。スレッドAは、この作業が完全に完了するまで待たなければなりません。私の考えは、nカウントでCountDownLatchを使用し、生産者/消費者パターンを使用して作業者を制御しています。プロダクト、コンシューマー、カウンターが正確にn回実行されるのを待ちます。

私はをカウンタとして使用します:プロデューサは、カウンタ値が0より大きいかどうかをチェックし、BlockingQueueに信号を入力します。カウンタ値が0以下の場合、プロデューサはstopSignalをキュー。コンシューマは、キューからシグナルがstopSignalと等しくないかどうかをチェックし、ExecutorServiceを使用してWorkerをスケジュールします。

ワーカーコールgetAndDecrementと作業が行われている場合はい、その後の仕事、 はそれは問題がある他たCountDownLatch番号のカウントダウンがincrementAndGet

でカウンターを増やす呼び出すない場合、カウンタの値が、0以上であるかどうかをチェック作業が完了していない場合、作業者はカウンタを増やす必要がありますが、これはgetAndDecrementの後です。プロデューサはカウンタの値が0であると見て、作業の合計がn未満であっても停止信号を出します。

+0

ちょうど* n *スレッドを起動してそれらを 'join()'することはできませんか?かもしれないだけ。 – 9000

+0

私は傾けることができます。 – robinmag

答えて

1

典型的なプロデューサー/コンシューマーの問題に取り組んでいるようですが、複雑さが増しています(正確にn回の作業が完了するのを待つ新しい条件)。あなたが定義したように、あなたは生産者と消費者を持っています。 1人は仕事をし、2人はそれを消費する。

作業が作成された後に増分します。作業後のデクリメントが消費されます。この方法では、使用可能な作業がある場合にのみ作業者がキューからフェッチしようとします。

あなたの問題に対処するために、nを待つという新しい条件が完了しました。一定量のジョブが終了するのを待っていて、これらのジョブを明確に認識している場合は、CyclicBarrierオブジェクトを使用して、すべてのジョブが障壁に到達するまでフローを停止することができます。

通常、並行して2人の調整作業者があります。プロデューサー/コンシューマーはこの問題の解決策ではないかもしれませんし、バリアーもそうではありません。私はjava.util.concurrentパッケージを調べることをお勧めします。

関連する問題