9

我有一个Callable<String>. 我想通过定期运行它ScheduledExecutorService.scheduleAtFixedRate(),并获取.call()我的可调用对象调用返回的所有字符串的列表。由于scheduleAtFixedRate不需要 Callable(仅Runnables),因此我需要推出一个Runnable包装 my的自定义Callable,类似于以下内容:

final Callable<String> myCallable = ....;
final ConcurrentLinkedQueue<String> results 
  = new ConcurrentLinkedQueue<String>();

Runnable r = new Runnable() {
  @Override public void run() {
    try {
      results.add(myCallable.call());
    } catch (Exception e) { 
      results.add(null);  // Assuming I want to know that an invocation failed
    }
  }
};

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(r, 0, 1, TimeUnit.SECONDS);

自然,我想避免推出我自己的自定义东西(尤其是在多线程代码中),所以我想知道有一个 JDK 类可以进行这种聚合吗?

4

1 回答 1

0

您在上面所做的是将您的 Callable 实现视为另一个普通类。您没有将可调用对象提交给 ThreadPool 执行程序。调用 Callable.call() 不使用 ThreadPoolExecutor。

您需要将您的任务(Runnable/Callable/ForkJoinTask 等)提交到 ThreadPool 以利用线程池。您可以使用 Futures 来收集执行后的结果。

ForkJoinPool 是一个选项,您可以尝试这是 JDK 7 的一部分。使用 ForkJoinTask 分叉任务并加入它们 为什么不使用 Futures?它们正是用于了解 Task 的状态及其结果。

你看过这个吗:Using Callable to Return Results From Runnables

于 2013-03-08T20:06:12.773 回答