2

私は次のような状況にあります:

  1. データベースからデータを読み取る
  2. 仕事「計算」をする
  3. 結果をデータベースに書き込む

データベースから読み取り、生成されたオブジェクトを BlockingQueue に入れるスレッドがあります。これらのオブジェクトは非常に重いため、キューはメモリ内のオブジェクトの量を制限します。複数のスレッドがキューからオブジェクトを取得し、作業を実行して、結果を 2 番目のキューに入れます。最後のスレッドは、2 番目のキューから結果を取得し、結果をデータベースに保存します。

問題は、デッドロックを防ぐ方法です。「計算スレッド」は、オブジェクトがキューに入れられなくなる時期を知る必要があります。現在、スレッド (呼び出し可能) の参照を相互に渡し、ポーリングまたはオファーの前に thread.isDone() をチェックし、要素が null であるかどうかを確認することで、これを実現しています。キューのサイズもチェックします。要素が含まれている限り、キューを消費する必要があります。take または put を使用すると、デッドロックが発生します。

これを達成するためのより簡単な方法はありますか?

4

2 に答える 2

0

達成する方法の1つは、キューにこれ以上タスクが到着しないことが確実な場合に、キューの最後のメッセージとして「ダミー」または「ポイズン」メッセージを配置することです。たとえば、関連するメッセージを配置した後などです。 dbクエリの最後の行に移動します。したがって、プロデューサーはダミーメッセージをキューに入れ、コンシューマーはこのダミーメッセージを受信すると、このバッチでこれ以上意味のある作業が期待されないことを認識します。

于 2011-09-06T05:19:30.280 に答える