次のシナリオがあります。複数のイベントが、それぞれ異なるタイプのソースから発生しています。同じタイプの各イベントを順番に処理する必要があり、他のタイプの場合は並行して処理する必要があります。意味:
ソースからのイベント: A1、A2、B1、A3、B2、C1
- リスナー A は、A1、A2、および A3 をキューに入れ、単一のスレッドでこの順序で処理する必要があります
- リスナー B は A と同じで、別のスレッドで並列に
- B と同じリスナー C、並列、別のスレッド
これを達成するために私は何をしていますか?一般的に言えば、新しいスレッドで初期化してからwait()を呼び出すイベントの種類ごとにモニターがあります。すべてのモニターにはキューがあります。
Monitor.java (実行可能な実装)
public void run(){
while(!killed){
synchronize(this){
while(this.stopped){
wait(); //it waits here when initialized, waiting for the first event
}
while(eventQueue.size() > 0){
//do something with the event
}
//i set the flag stopped = true again to wait for the next event
this.stopped = true;
}
}
}
イベントが到着したら、それをキューに追加してから、モニターに notify() して、その間を中断します
public void awake(Event event){
synchronize(this){
eventQueue.add(event);
this.stopped = false;
notify();
}
}
「killed」フラグは、特定の基準が満たされるまでスレッドを存続させるために使用されます。次に、killed フラグを true に設定し、モニターにスレッドを終了するように通知します。
私の問題は、一連のイベントを実行するときに、通知 () でスレッドが起動しないことがあります。10 件中 10 件のイベントが処理されることもあれば、10 件中 8 件ということもあります。
私の問題の代替手段を探して並行APIを調べてきましたが、良いものが見つかりません。この問題に立ち向かう方法についてアドバイスをいただけますか?
私の問題を良い方法で説明していることを願っています。そうでない場合は、お尋ねください。
前もって感謝します。