通过ScheduledExecutorService定期运行Callable

时间:2012-11-26 01:45:14

标签: java java.util.concurrent

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

1 个答案:

答案 0 :(得分:0)

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

您需要将您的Task(Runnable / Callable / ForkJoinTask等)提交给ThreadPool以利用线程池。 您可以使用期货在执行后收集结果。

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

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