我有一台Callable<String>。我想通过ScheduledExecutorService.scheduleAtFixedRate()定期运行它,并在callable上获得由.call()调用返回的所有String的列表。由于scheduleAtFixedRate不接受Callable (仅接受Runnables),因此我需要推出一个自定义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类可以执行这种聚合?
发布于 2013-03-09 04:06:13
上面所做的就是将您的Callable实现看作是另一个普通的类。您没有将callable提交给ThreadPool executor。调用Callable.call()不使用ThreadPoolExecutor。
您需要提交任务(Runnable/Callable/ForkJoinTask等)。添加到ThreadPool以利用线程池。一旦执行,您可以使用Futures来收集结果。
ForkJoinPool是一个你可以尝试的选项,它是JDK7的一部分。使用ForkJoinTask分支任务并加入它们,为什么不使用Futures呢?它们的目的正是为了了解任务的状态及其结果。
https://stackoverflow.com/questions/13557612
复制相似问题