通俗易懂的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源码剖析-StampedLock

通俗易懂的JUC源码剖析-FutureTask

通俗易懂的JUC源码剖析-ArrayBlockingQueue

通俗易懂的JUC源码剖析-ReentrantLock&AQS

通俗易懂的JUC源码剖析-CompletionService