如果我在 a 中运行一个线程,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());
}
此方法仅在您的异常未选中时才有效。如果您检查了异常,请重新将它们包裹在 a 中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 回答