私はいくつかの計算を実行するスレッドを持っており、各計算には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
スレッドが存在しない場合の対処方法を教えてください。
私はそれを完全に理解していないのでしょうか?だから私はコレクションにロックを保持したいですか?しかし、どのように通知し、それを待つのですか?あなたはもっと詳しく説明できますか? – rd22
'notifyAll'や' wait'のような関数の使い方を知っていますか?そうでない場合、あなたはこのようなことをする準備ができていません。 [ここ](http://howtodoinjava.com/core-java/multi-threading/how-to-work-with-wait-notify-and-notifyall-in-java/)を開始してください。 (あなたが待っている共有状態を保護したり通知しているロックを保持している間は 'notifyAll'と' wait'の両方を呼び出すのが普通です。) –
実際には、あなたの疑似コードでそれを持つことができます。あなたは疑似コードを理解していますか? –