2016-09-27 13 views
1

私はいくつかの計算を実行するスレッドを持っており、各計算にはidがあります。 計算ごとに新しいスレッドが開始されます。 処理が完了すると、そのIDに対応するデータベースにデータが書き込まれます。別のスレッドが存在するかどうかのスレッド同期

別の要求がある可能性があります(またはそうでない可能性があります)。これは、他のスレッドからの計算結果を必要とします。 IDのデータベースを検索し、見つかった場合は結果を返します。 計算が既に進行中かどうかを確認する必要がある場合は、 です。計算が完了するまで待ちます。一度起動すると、データベースからデータを取得して戻ります。 計算が実行されていない場合は、計算を開始して待ちます。一度起動すると、データベースからデータを取得して戻ります。

The pseudo code is as follow: 
CalculationClass 
    receive a request id from a Consumer 
    add id to CalculatingIds List 
    when calculated 
     write data to DB 
     remove id from CalculatingIds List 

GetDataClass 
    look for the the result corresponding to id 
    if found return data 
    else check if the id is present in the CalculatingIds List 
     if present, wait and wake up when data is available 
     if not present, pass the id to the Consumer Queue. Wait and wake up when data is available 

私は、データがまだGetDataClassための準備ができていないときの場合の2つのスレッドを同期する方法を見つけることができないのです。私は計算ごとに新しいオブジェクトを作成し、2つのスレッドを同期するためにこれを使用することを考えていました。

synchronize(lock) 
    if(noData && calculationRunning) 
    lock.wait(); 
    else 
    queue.add(id) 
    CalculatingIds.add(id) 

しかし、このロックはCalculationClassの場合どのように処理しますか? GetDataClassスレッドが存在しない場合の対処方法を教えてください。

答えて

2

現在処理中のものを追跡するコレクションがあります。それをロックで保護しました。特定のエントリを処理しているスレッドは、そのコレクションに対してロックを保持している間にそのような通知を行います。終了すると、コレクションのロックを取得し、エントリを削除し、notifyAllを呼び出して他のスレッドに通知します。スレッドがコレクションのロックを保持している間に別のスレッドからエントリを検出した場合、スレッドはwaitをループして、別のスレッドが終了するまで通知します。

+0

私はそれを完全に理解していないのでしょうか?だから私はコレクションにロックを保持したいですか?しかし、どのように通知し、それを待つのですか?あなたはもっと詳しく説明できますか? – rd22

+0

'notifyAll'や' wait'のような関数の使い方を知っていますか?そうでない場合、あなたはこのようなことをする準備ができていません。 [ここ](http://howtodoinjava.com/core-java/multi-threading/how-to-work-with-wait-notify-and-notifyall-in-java/)を開始してください。 (あなたが待っている共有状態を保護したり通知しているロックを保持している間は 'notifyAll'と' wait'の両方を呼び出すのが普通です。) –

+0

実際には、あなたの疑似コードでそれを持つことができます。あなたは疑似コードを理解していますか? –

関連する問題