前言
置信大多数人对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公里!