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中没有一个现有的实用程序可以为您将可调用的结果放入集合中。这就是我的想法。谢谢