0

我有一个并行运行多个求解器的 ExecutorService。每个求解器都会修改几个必须返回值的内部变量。由于兼容性问题,不可能将所有变量封装在一个类中以通过可调用对象返回。因此,使求解器可调用或可运行对我的情况没有任何影响,因为我无法检索我需要的所有变量。

我考虑了以下两个选项:

  1. 每个求解器访问一个同步类并将其值写入那里。
  2. 访问 executor 提交的对象(求解器),以便通过 get 方法获取它们的变量。

我更喜欢第二种选择,但我找不到访问提交对象的方法。

有什么建议(对于任何选项)?

4

1 回答 1

0

您没有详细说明“兼容性问题”,因此我只能针对您所描述的内容提出一般解决方案。

由于您使用ExecutorService,我相信您使用ThreadPoolExecutor(或其子类)作为该接口的实现。如果是这种情况,我建议覆盖ThreadPoolExecutor.afterExecute(Runnable r, Throwable t)方法。在任何提交Runnable完成后调用它。它的默认实现是空的。

您的实施应遵循以下步骤:

  1. 检查是否t != null。如果是这样,Throwable t导致求解器中止的过程。
  2. 检查的类型,r如果你识别它,检索它的结果。当然,如果你所有的求解器都有一个通用的 API,它会更简单。
  3. 将结果存储在某处。

但请注意 -ThreadPoolExecutor.afterExecute()从运行 的线程中调用Runnable r,因此第 3 步很可能需要同步。

将它们放在一起,您的代码可能如下所示:

if (t != null) {
    // handle t
} else {
    Solver solver = (Solver)r;
    Results results = solver.getResults();
    synchronized (allSolutions) {
        allSolutions.addResults(results);
    }
}
于 2012-12-18T22:16:39.923 回答