スレッドを実行する場合ExecutorService
、このスレッドが実行を開始したときに例外をスローしなかったことを知る方法はありますか?
質問する
3648 次
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
事前に焼いたものではなく、独自のものを使用してくださいExecutors
。afterExecute
次に、TPE によって提供されるフックをオーバーライドして、例外で必要なことを行います。
于 2013-03-01T15:07:08.403 に答える