2

を完了し、私は次のような状況があります。データベース 生産者 - 消費者:どのようにprodcutionを知らせる知っている

  • から

    1. 読み出しデータは、作業「計算」を行う
    2. 書き込み結果データベース

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

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

    これを実現する簡単な方法はありますか?

  • +0

    は、http://stackoverflow.com/questions/5326013/proper-implementation-of-producer-consumer-scenario-and-graceful-termination-ofの欺瞞である可能性があります –

    答えて

    0

    達成するための方法の1つは、キューに最後のメッセージとして「ダミー」または「ポイズン」メッセージを入れることです。これ以上のタスクがキューに到着しないことがわかった場合などです。 dbクエリーの最後の行に関連するメッセージを入れます。プロデューサがキューにダミー・メッセージを置くと、このダミー・メッセージを受け取った消費者は、このバッチで意味のある作業がないことを知っています。

    +0

    私が持っているものは、プロデューサー - 消費者のようなものです/生産者 - 消費者パターン。中間部分はデータを消費し、その結果を別のコンシューマに転送します。事は、私はこの "中間部分"の複数のインスタンスを持っているということです。これが、頑張った仕事です。問題はダミーに対して作業が行われないため、「ダミーデータ」が以前の「実際のデータ」よりも速くこのチェーンを通過できることです。 –

    +0

    ダミーのデータまたはposionメッセージは、単にデッドロックの状況を回避するためのものでした。あなたはメッセージが到着する予定がないことを知っています。既に開始されたタスクの完了を追跡するためにカウントダウンラッチなどを使用することもできます。 – Scorpion

    0

    たぶん、あなたはエグゼキュータと1中のキュー機能を組み合わせるために設計されてCompletionService

    を見てみる必要があります。実行が完了し タスクは、再びあなたがcompletionServiceInstanceから取られた結果と餌になる結果とDBを埋める3.すなわちのための別のエグゼキュータを使用することができます

    completionServiceInstance.take() 
    

    を通じて補完サービスから利用できるようになります。

    +0

    これは私が大量のタスクを回すのではなく、データベースから生成されたオブジェクトであるため、私には役に立ちません。私は並行して実行する必要がある3つのタスクを持っています1.データベースからの読み取り2.作業3.データベースへの結果の書き込み。読み取りと書き込みは実際の作業よりもはるかに高速であるため、メモリー使用量を制限するために並列に処理する必要があります。 –

    関連する問題