我正在尝试找到一种在多线程环境下处理异常的方法。我想并行执行某些任务,每个任务可能会抛出异常,我需要对其进行反应(基本上是将失败的任务放回执行队列)。然而,似乎从线程中实际获取异常的唯一方法是创建Future并调用其get()方法。然而,这实际上将调用变成了同步调用。
也许一些代码可以说明问题:
在这种情况下,异常在catch块中已经被捕获了,但代价是必须等待此操作完成才能执行。因此,任务是按顺序而不是并行执行的,这不是我们所期望的。
我错过了什么?如何捕获每个任务的异常并对其做出反应?
也许一些代码可以说明问题:
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
Task task = taskQueue.poll(); // let's assume that task implements Runnable
try {
executor.execute(task);
}
catch(Exception ex) {
// record the failed task, so that it can be re-added to the queue
}
然而,在这种情况下,所有任务都被启动了,但异常似乎并没有在此catch块中捕获。
另一种选择是使用Future而不是线程,并检索其结果:
try {
Future<?> future = executor.submit(task);
future.get();
}
...
在这种情况下,异常在catch块中已经被捕获了,但代价是必须等待此操作完成才能执行。因此,任务是按顺序而不是并行执行的,这不是我们所期望的。
我错过了什么?如何捕获每个任务的异常并对其做出反应?