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

前言

相信大多数人对ExecutorService比较熟悉,那么CompletionService是什么东东呢?

使用场景

我们来看JDK官方doc给的栗子,假设现在有个计算问题,伪代码可抽象为Result compute(),且有一组解决方案,每个方案都会返回结果Result,我们希望并行执行这些方案,然后采取一定策略去决定使用哪个方案的结果。比如,使用最先返回结果的方案,然后取消执行其他方案的线程。代码可以这么写:

void solve(Executor e, Collection> solvers)
     throws InterruptedException {
     CompletionService ecs
         = new ExecutorCompletionService(e);
     int n = solvers.size();
     List> futures
         = new ArrayList>(n);
     Result result = null;
     try {
         for (Callable 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 f : futures)
             f.cancel(true);
     }
     // 使用最先执行完的结果
     if (result != null)
         use(result);

实现原理

后续再分析咯,先去跑个5公里!

你可能感兴趣的:(java)