乐趣区

关于java:通俗易懂的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 公里!

退出移动版