您没有详细说明“兼容性问题”,因此我只能针对您所描述的内容提出一般解决方案。
由于您使用ExecutorService
,我相信您使用ThreadPoolExecutor
(或其子类)作为该接口的实现。如果是这种情况,我建议覆盖ThreadPoolExecutor.afterExecute(Runnable r, Throwable t)
方法。在任何提交Runnable
完成后调用它。它的默认实现是空的。
您的实施应遵循以下步骤:
- 检查是否
t != null
。如果是这样,Throwable
t
导致求解器中止的过程。
- 检查的类型,
r
如果你识别它,检索它的结果。当然,如果你所有的求解器都有一个通用的 API,它会更简单。
- 将结果存储在某处。
但请注意 -ThreadPoolExecutor.afterExecute()
从运行 的线程中调用Runnable
r
,因此第 3 步很可能需要同步。
将它们放在一起,您的代码可能如下所示:
if (t != null) {
// handle t
} else {
Solver solver = (Solver)r;
Results results = solver.getResults();
synchronized (allSolutions) {
allSolutions.addResults(results);
}
}