首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过ScheduledExecutorService定期运行Callable

通过ScheduledExecutorService定期运行Callable
EN

Stack Overflow用户
提问于 2012-11-26 09:45:14
回答 1查看 3.7K关注 0票数 9

我有一台Callable<String>。我想通过ScheduledExecutorService.scheduleAtFixedRate()定期运行它,并在callable上获得由.call()调用返回的所有String的列表。由于scheduleAtFixedRate不接受Callable (仅接受Runnables),因此我需要推出一个自定义Runnable来包装我的Callable,如下所示:

代码语言:javascript
复制
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类可以执行这种聚合?

EN

回答 1

Stack Overflow用户

发布于 2013-03-09 04:06:13

上面所做的就是将您的Callable实现看作是另一个普通的类。您没有将callable提交给ThreadPool executor。调用Callable.call()不使用ThreadPoolExecutor。

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

ForkJoinPool是一个你可以尝试的选项,它是JDK7的一部分。使用ForkJoinTask分支任务并加入它们,为什么不使用Futures呢?它们的目的正是为了了解任务的状态及其结果。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13557612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档