所以我有这段Java代码,我需要在一堆项目上做一些工作。我决定将其并行化以获得一些额外的提升,但我仍然使用ThreadPoolExecutor。问题是,我需要做的工作可以抛出异常...在ThreadPool中报告异常并关闭
现在我想关闭整个工作,一遇到错误就停下来,并报告回来,以便我可以处理它。在网上查看时,我发现通过ExecutorCompletionService和分析未来结果的正常方式。但是,当第一个错误出现时,这不会让我关闭所有的东西,因为没有办法根据哪个任务先完成循环...
所以我做了一些我认为是相当黑客和我很好奇,如果有更好的方法来处理这个问题。我所做的是:
1)让每个我将执行的Runnable都有一个可执行Throwable的字段。 2)覆盖TPE的“afterExecute”方法,并检查是否有任何检查的异常被抛出(记录在Runnable中)或任何未被检查的异常被抛出(应该在此方法的第二个参数中报告)。如果有的话,我在TPE上发出shutdownNow()。
同样,这似乎有点hacky,我想知道是否有什么我失踪。提前致谢!
是否需要停止其他任务执行刚性测试,在第一次失败后甚至执行单个测试是灾难性的?或者它是一个“有益”的要求,因为如果其他任务保持运行一段时间就可以了,但是越快它们停下来越好?我问,因为即使说“第一次失败来临”在并行执行环境中也不清楚,因为没有仔细的同步,你不知道在不同线程上执行任务的顺序。 –
你明白了“很高兴”的要求,因为我只想通知所有并行任务,当他们中的一个遇到错误时应立即停止。当然,由于线程在池中运行的方式,这可能并不意味着“尽快”,但这是一个原则性的事情。 实际上,您可以将其视为具有启动我的ThreadPool的阻止调用,并且我希望这可以报告结果,如果一切正常,或尽快解除阻止以最大限度地提高可用性。 –