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 楼答案
上面所做的是将可调用实现视为另一个普通类。您没有将可调用提交给线程池执行器。打电话给Callable。call()不使用ThreadPoolExecutor
您需要提交任务(可运行/可调用/ForkJoinTask等)到线程池以利用线程池。 一旦执行,您可以使用Futures来收集结果
ForkJoinPool是您可以尝试的一个选项,它是JDK 7的一部分。分叉任务,并使用ForkJoinTask加入它们 为什么不使用期货?它们正是为了了解任务的状态及其结果
你看过这个:Using Callable to Return Results From Runnables