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