检索通过ExecutorService.submit执行的对象

时间:2012-08-21 06:23:23

标签: submit return runnable executorservice callable

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

我考虑过以下两个选项:

  1. 每个求解程序访问同步类并在其中写入其值。
  2. 访问执行程序提交的对象(解算器),以便通过get方法获取变量。
  3. 我更喜欢第二种选择,但我找不到访问提交对象的方法。

    任何建议(对于任何选项)?

1 个答案:

答案 0 :(得分:0)

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

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

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

  1. 检查是否t != null。如果是,请处理导致解算器中止的Throwable t
  2. 检查r的类型,如果您认出它,请检索其结果。当然,如果所有求解器都有一个通用API,那将会更简单。
  3. 将结果存储在某处。
  4. 但是请注意 - ThreadPoolExecutor.afterExecute()是从运行Runnable r的主题调用的,因此第3步很可能需要同步。

    总而言之,您的代码可能如下所示:

    if (t != null) {
        // handle t
    } else {
        Solver solver = (Solver)r;
        Results results = solver.getResults();
        synchronized (allSolutions) {
            allSolutions.addResults(results);
        }
    }