0

処理するイベント キューがあります。スレッドはイベントをキューに追加します。メソッドでイベントを処理するために必要なすべてを
実行する実行可能なタスクを作成しました。私は各タスク を 宣言しました。run
Executors.newCachedThreadPool();execute

        public class EventHandler {

            private static final ExecutorService handlers = Executors.newCachedThreadPool();

            public void handleNextEvent(AnEvent event){

                  handlers.execute(new Task(evt)); 

            }   


        public class Task implements Runnable{

        @Override
            public void run() {
            //Event processing
            }
        }

public AnotherClass{    
    public void passEvent(AnEvent evt)//This is called by another thread
    {
      EventHandler.handleNextEvent(evt);

    }
}

私の問題はexecute、エグゼキュータを呼び出すと、コードが次のイベントを取得し、エグゼキュータを介して次の実行可能ファイルを実行することです。私の目的は、前のタスクが終了した後にのみキューから次のイベントを処理することです。
handleNextEvent を再度呼び出すことができるように、前のタスクが終了したかどうかをどのように確認できますか?
タスクによっていくつかのステータス フィールドを更新するのは良い考えですか?

ありがとう

4

2 に答える 2

6

Executors.newCachedThreadPool()オンデマンドで新しいスレッドを作成するため、必要なものではありません。Executors.newSingleThreadExecutor()一度に 1 つずつイベントを処理し、残りをキューに入れる のようなものが必要です。

javadocを参照してください。

無制限のキューで動作する単一のワーカー スレッドを使用する Executor を作成します。(ただし、シャットダウン前の実行中に障害が発生したためにこの単一のスレッドが終了した場合、後続のタスクを実行するために必要に応じて新しいスレッドが代わりに使用されることに注意してください。)タスクは順次実行されることが保証されており、複数のタスクがアクティブになることはありません。いつでも。

于 2010-11-05T08:38:07.677 に答える
0

私はExecutors.newSingleThreadExecutor()submit()メソッドがあなたの問題の解決策だと思います:http: //download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorService.html

于 2010-11-05T09:16:20.473 に答える