0

私のコードについて質問があります。

メイン メソッドから実行されている 2 つのスレッドがあり、メイン メソッドの 2 つのスレッドのいずれかで発生する可能性のある例外をキャッチしたいと考えています。

Future<Object> incoming=Executors.newSingleThreadExecutor().submit(new Task1(param1));
Future<Object> outgoing=Executors.newSingleThreadExecutor().submit(new Task2(param2));

問題は、Future Object を使用して例外に get() メソッドを呼び出すと、コードがブロックされ、スレッド 2 がスレッド 1 の前に終了/例外をスローしたかどうかがわからないことです。

これの代わりにこれをエレガントに処理するにはどうすればよいですか?

while(!(incoming.isDone() || outgoing.isDone())){}
4

2 に答える 2

2

例外が発生したらすぐに処理し、他のタスクが完了するのを待たない場合は、例外を非同期で処理します。

 ExecutorService oneService = ...

 oneService.submit(new Runnable() {
    public void run() {
        try {
            new Task(param1).run();
        } catch(Exception e) {
            // handle exception asynchronously
        }
    }        
 });
于 2012-07-25T13:35:13.197 に答える
0

これはどう:

すべてのスレッド間で共有されるキュー (スレッドセーフであることを確認してください!)、

Queue<Throwable> exceptionsToProcess;

次に、main メソッドを while ループでロックします。

//start threads, pass them the queue


while(true)
{
    Throwable t;
    while((t = exceptionsToProcess.poll()) == null);
    //process t
}

例外は正しい順序で処理されますが、スレッド セーフに注意しないと ConcurrentModificationException が発生するリスクがあります。

編集:これは、この目的に役立つキュー クラスかもしれません: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/LinkedBlockingQueue.html

于 2012-07-25T13:38:59.530 に答える