【问题标题】:Periodically running a Callable via ScheduledExecutorService通过 ScheduledExecutorService 定期运行 Callable
【发布时间】:2012-11-26 01:45:13
【问题描述】:

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

【问题讨论】:

  • 不,jdk 中没有现有实用程序可以为您将 Callable 结果放入集合中。
  • 我就是这么想的。谢谢。

标签: java java.util.concurrent


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    相关资源
    最近更新 更多