如果我在ExecutorService
中运行一个线程,有没有办法知道这个线程在开始执行时没有抛出异常?
答案 0 :(得分:5)
根据the 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
界面。
答案 1 :(得分: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 ());
}
答案 2 :(得分:0)
在您的另一个问题中说明这一点:使用您自己的ThreadPoolExecutor
代替Executors
中预先出炉的afterExecute
。然后覆盖TPE提供的{{1}}挂钩,以便在例外情况下执行任何操作。
答案 3 :(得分:0)
get()
的{p Future
方法会抛出ExecutionException
。包含在此异常中的实际异常。