我正在向一个ExecutorService
提交线程。
这些线程正在操作一些数据,如果发生冲突,数据对象将抛出异常,该异常被冲突线程捕获,然后中止并且未能完成执行。
当这种情况发生时,中止的线程需要放回队列并重新提交到执行器。
如何从父线程中检测是否发生了异常?
我正在向一个ExecutorService
提交线程。
这些线程正在操作一些数据,如果发生冲突,数据对象将抛出异常,该异常被冲突线程捕获,然后中止并且未能完成执行。
当这种情况发生时,中止的线程需要放回队列并重新提交到执行器。
如何从父线程中检测是否发生了异常?
ExecutorService
提交任务时会返回一个Future
,等待执行完成后,可以调用该Future
的get()
方法获取结果。如果有适用的结果,则返回结果,否则将抛出ExecutionException
。如果需要真正的异常对象,可以使用getCause()
方法。
注意,将任务放回ExecutorService
时,该任务将在一个未真正终止的Thread
上运行(只是捕获了异常并等待新异常的发生)。
以下是示例用法(如果您不关心结果,可以使用Runnable
):
Callable<String> myCallable = ...;
Future<String> future = myExector.submit(myCallable);
// Do something else until myCallable.isDone() returns true.
try {
String result = future.get();
}catch(ExecutionException e){
// Handle error, perhaps create new Callable to submit.
}