通俗易懂的JUC源码剖析-CompletionService
Posted 小强大人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通俗易懂的JUC源码剖析-CompletionService相关的知识,希望对你有一定的参考价值。
前言
相信大多数人对ExecutorService比较熟悉,那么CompletionService是什么东东呢?
使用场景
我们来看JDK官方doc给的栗子,假设现在有个计算问题,伪代码可抽象为Result compute(),且有一组解决方案,每个方案都会返回结果Result,我们希望并行执行这些方案,然后采取一定策略去决定使用哪个方案的结果。比如,使用最先返回结果的方案,然后取消执行其他方案的线程。代码可以这么写:
void solve(Executor e, Collection<Callable<Result>> solvers)
throws InterruptedException {
CompletionService<Result> ecs
= new ExecutorCompletionService<Result>(e);
int n = solvers.size();
List<Future<Result>> futures
= new ArrayList<Future<Result>>(n);
Result result = null;
try {
for (Callable<Result> s : solvers)
futures.add(ecs.submit(s));
for (int i = 0; i < n; ++i) {
try {
// 遍历所有方案的Future,获取最先执行完的任务结果
Result r = ecs.take().get();
if (r != null) {
result = r;
break;
}
} catch (ExecutionException ignore) {}
}
}
finally {
// 中断其他方案的线程
for (Future<Result> f : futures)
f.cancel(true);
}
// 使用最先执行完的结果
if (result != null)
use(result);
实现原理
后续再分析咯,先去跑个5公里!
以上是关于通俗易懂的JUC源码剖析-CompletionService的主要内容,如果未能解决你的问题,请参考以下文章
通俗易懂的JUC源码剖析-LinkedBlockingQueue
通俗易懂的JUC源码剖析-ArrayBlockingQueue