有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java定期运行通过ScheduledExecutorService调用的

我有一个Callable<String>。我希望通过ScheduledExecutorService.scheduleAtFixedRate()定期运行它,并获取由我的callable上的.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类可以进行这种聚合


共 (1) 个答案

  1. # 1 楼答案

    上面所做的是将可调用实现视为另一个普通类。您没有将可调用提交给线程池执行器。打电话给Callable。call()不使用ThreadPoolExecutor

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

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

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