所以我有这段Java代码,我需要在一堆项目上做一些工作。我决定将其并行化以获得额外的提升,但我使用ThreadPoolExecutor。问题是我需要做的工作可以抛出异常......
现在我想在遇到错误时立即关闭整个作业并将其报告回来以便我可以处理它。在线查看,我发现应该这样做的正常方法是通过ExecutorCompletionService并分析Future结果。但是,当第一个错误发生时,这不会让我关闭所有内容,因为根据哪个任务完成首先无法循环...
所以我做了一些我认为相当hacky的东西,我很好奇是否有更好的方法来解决这个问题。我做的是:
1)让我将执行的每个Runnable都有一个可执行的Throwable字段。 2)覆盖TPE的“afterExecute”方法并检查是否抛出了任何已检查的异常(它被记录在Runnable中)或者任何未经检查的异常被抛出(应该在此方法的第二个参数中报告)。如果有,那么我在TPE上发出shutdownNow()。
再次,这看起来有点hacky,我想知道是否有我遗漏的东西。提前谢谢!
答案 0 :(得分:2)
执行给定的任务,返回已成功完成的任务的结果(即,不抛出异常),如果有的话。在正常或特殊退货时,未完成的任务将被取消。如果在此操作正在进行时修改了给定集合,则此方法的结果未定义。
看起来你做的事情完全一样......如果我能正确理解你的问题。
但是,对于取消执行任何操作,您必须使Callable
任务中断。但无论您如何尝试取消任务,这都适用。
修改强>:
这不是你需要的;我误读了javadoc。这是另一个解决方案:您可以将所有Future
放在一个列表中,然后进行半繁忙的while循环,定期检查每个futureList.get(i).get(100, TimeUnits.MILLISECONDS)
,然后您可以捕获异常并采取相应措施。但是,这不比你的解决方案更“优雅”。似乎afterExecute
无论如何都是为了做你想做的事。