知道所有线程何时完成并处理exception

我正在使用Executor框架使用线程池启动多个线程,即newFixedThreadPool。 我使用threadpool.submit(aThread)来提交要由线程池执行的作业,这很好但是我需要确定所有线程何时完成,以便我可以继续进行其他处理。 我看着使用Future.get()阻塞直到线程完成这里的问题是它阻塞直到结果可用。 我还看到在发出关闭后继续调用isTerminated()方法然后调用sleep来检查是否所有线程都已完成,但这对我来说似乎并不整齐。 还有另一种清洁方式吗? 此外,如果在任何一个线程中引发exception,我希望能够终止所有其他正在运行的线程,并且还要阻止池中任何排队的线程启动。 这样做的最佳机制是什么?

期待听到您的回复

TIA

解决此问题的一种更简洁的方法是修改提交的任务。 通过向每个任务注册回调,它可以在没有主线程轮询的情况下通知正常完成或exception。

您可以编写一个简单的包装器来为任何Runnable 执行此操作 。

或者,在该示例之后,您可以扩展想法以包装任何Callable

 class CallbackTask implements Callable { private final Callable task; private final Callback callback; CallbackTask(Callable task, Callback callback) { this.task = task; this.callback = callback; } public T call() throws Exception { try { T result = task.call(); callback.complete(result); return result; } catch (Exception ex) { callback.failed(ex); throw ex; } } } 

使用ExecutorService#shutdown()然后使用ExecutorService #awaitTermination()

例如:

 ExecutorService service = Executors.newCachedThreadPool(); service.submit(...); service.submit(...); service.shutdown(); service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); // All tasks have now finished 

至于在任务因exception而失败时通知您。 您必须向ExecutorService提供一个ThreadFactory ,它为它创建的每个线程设置一个“未捕获的exception处理程序”。 然后,此exception处理程序可以终止正在运行的任务。