Java 定期运行可通过ScheduledExecutorService调用的

Java 定期运行可通过ScheduledExecutorService调用的,java,java.util.concurrent,Java,Java.util.concurrent,我有一个可调用的。我想通过ScheduledExecutorService.scheduleAtFixedRate()定期运行它,并获取调用我的可调用对象时.call()调用返回的所有字符串的列表。由于scheduleAtFixedRate不接受Callable(仅Runnables),我需要推出一个自定义Runnable,它包装了我的Callable,大致如下: final Callable<String> myCallable = ....; final ConcurrentLi

我有一个
可调用的
。我想通过
ScheduledExecutorService.scheduleAtFixedRate()
定期运行它,并获取调用我的可调用对象时
.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);
final Callable myCallable=。。。。;
最终ConcurrentLinkedQueue结果
=新的ConcurrentLinkedQueue();
Runnable r=新的Runnable(){
@重写公共无效运行(){
试一试{
results.add(myCallable.call());
}捕获(例外e){
results.add(null);//假设我想知道调用失败
}
}
};
ScheduledExecutorService executor=执行者。newScheduledThreadPool(1);
executor.scheduleAtFixedRate(r,0,1,时间单位秒);

当然,我不想推出我自己的自定义内容(特别是在多线程代码中),所以我想知道是否有一个JDK类可以进行这种聚合?

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

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

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


您看到了吗:

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