我有一个Callable<String>。我想通过ScheduledExecutorService.scheduleAtFixedRate()定期运行它,并获取可调用对象上.call()调用返回的所有字符串的列表。由于scheduleAtFixedRate不接受Callable(仅接受Runnable),因此我需要推出一个自定义Runnable来包装我的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类可以进行这种聚合?

最佳答案

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

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

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

您是否看过这个:Using Callable to Return Results From Runnables

关于java - 通过ScheduledExecutorService定期运行Callable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13557612/

10-13 04:20