你可以使用CompletionService在期货准备就绪时立即接收它们,如果其中之一引发异常,则取消处理。像这样:
Executor executor = Executors.newFixedThreadPool(4);CompletionService<SomeResult> completionService = new ExecutorCompletionService<SomeResult>(executor);//4 tasksfor(int i = 0; i < 4; i++) { completionService.submit(new Callable<SomeResult>() { public SomeResult call() {...return result; } });}int received = 0;boolean errors = false;while(received < 4 && !errors) { Future<SomeResult> resultFuture = completionService.take(); //blocks if none available try { SomeResult result = resultFuture.get(); received ++; ... // do something with the result } catch(Exception e) { //log errors = true; }}我认为,如果其中一个抛出错误,你可以进一步取消任何仍在执行的任务。



