Ita*_*man 8 java java.util.concurrent
我有一个Callable<String>.我想定期运行它ScheduledExecutorService.scheduleAtFixedRate(),并获取.call()我的callable上的调用返回的所有字符串的列表.由于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);
Run Code Online (Sandbox Code Playgroud)
当然,我想避免推出我自己的自定义东西(特别是在多线程代码中),所以我想知道有一个JDK类可以进行这种聚合吗?
您上面所做的是将 Callable 实现视为另一个普通类。您没有将可调用对象提交给 ThreadPool 执行程序。调用 Callable.call() 不使用 ThreadPoolExecutor。
您需要将任务(Runnable/Callable/ForkJoinTask 等)提交到线程池才能利用线程池。您可以使用 Futures 来收集执行后的结果。
ForkJoinPool 是您可以尝试的一个选项,它是 JDK 7 的一部分。使用 ForkJoinTask 分叉任务并加入它们 为什么不使用 Futures?它们正是用于了解任务的状态及其结果。
你看过这个吗:Using Callable to Return Results From Runnables
| 归档时间: |
|
| 查看次数: |
3009 次 |
| 最近记录: |