2

スレッドを実行する場合ExecutorService、このスレッドが実行を開始したときに例外をスローしなかったことを知る方法はありますか?

4

4 に答える 4

5

JavaDocに従って、実行可能ファイルをエグゼキューターに送信できます。submit()

    ExecutorService service = Executors.newSingleThreadExecutor();
    Future f = service.submit(new Runnable() {
        @Override
        public void run() {
            throw new RuntimeException("I failed for no reason");
        }
    });
    try {
        f.get();            
    } catch (ExecutionException ee) {
        System.out.println("Execution failed " + ee.getMessage());
    } catch (InterruptedException ie) {
        System.out.println("Execution failed " + ie.getMessage());
    }

このメソッドは、例外がチェックされていない場合にのみ機能します。例外をチェックした場合は、それらを にラップして再スローするRuntimeExceptionか、インターフェースのCallable代わりに を使用しRunnableます。

于 2013-03-01T15:14:45.723 に答える
2
ExecutorService executor = Executors.newFixedThreadPool (4);

Future <?> future = executor.submit (new Runnable ()
{
    @Override
    public void run () {
        // while (true);
        throw new RuntimeException ("Something bad happend!");
    }
});

Thread.sleep (1000L);

try
{
    future.get (0, TimeUnit.MILLISECONDS);
}
catch (TimeoutException ex)
{
    System.out.println ("No exceptions");
}
catch (ExecutionException ex)
{
    System.out.println ("Exception happend: " + ex.getCause ());
}
于 2013-03-01T15:11:52.017 に答える
0

get()のメソッドは、タスクを実行していたスレッドで例外が発生した場合にをFutureスローします。ExecutionExceptionこの例外にラップされて発生した実際の例外。

于 2013-03-01T15:19:41.853 に答える
0

あなたの他の質問でこれを言っただけです:ThreadPoolExecutor事前に焼いたものではなく、独自のものを使用してくださいExecutorsafterExecute次に、TPE によって提供されるフックをオーバーライドして、例外で必要なことを行います。

于 2013-03-01T15:07:08.403 に答える