我有一个ExecutorService并行运行多个求解器。每个求解器修改几个必须返回值的内部变量。 由于兼容性问题,无法将所有变量封装在要通过可调用对象返回的类中。因此,使求解器可调用或可运行在我的情况下没有任何区别,因为我无法检索所需的所有变量。
我考虑过以下两个选项:
我更喜欢第二种选择,但我找不到访问提交对象的方法。
任何建议(对于任何选项)?
答案 0 :(得分:0)
您没有详细说明“兼容性问题”,因此我只能为您所描述的内容提出一般解决方案。
由于您使用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);
}
}