私は次のような状況にあります:
- データベースからデータを読み取る
- 仕事「計算」をする
- 結果をデータベースに書き込む
データベースから読み取り、生成されたオブジェクトを BlockingQueue に入れるスレッドがあります。これらのオブジェクトは非常に重いため、キューはメモリ内のオブジェクトの量を制限します。複数のスレッドがキューからオブジェクトを取得し、作業を実行して、結果を 2 番目のキューに入れます。最後のスレッドは、2 番目のキューから結果を取得し、結果をデータベースに保存します。
問題は、デッドロックを防ぐ方法です。「計算スレッド」は、オブジェクトがキューに入れられなくなる時期を知る必要があります。現在、スレッド (呼び出し可能) の参照を相互に渡し、ポーリングまたはオファーの前に thread.isDone() をチェックし、要素が null であるかどうかを確認することで、これを実現しています。キューのサイズもチェックします。要素が含まれている限り、キューを消費する必要があります。take または put を使用すると、デッドロックが発生します。
これを達成するためのより簡単な方法はありますか?