Java CompletionService 的作用与场景解析

问:简单说说 CompletionService 的作用和使用场景及原理?

答:CompletionService 是一个泛型接口,其实现类是 ExecutorCompletionService,其主要解决的场景是:主线程提交多个任务然后希望有任务完成就处理结果,并且按照任务完成顺序逐个处理(譬如并发请求返回刷新 UI 的操作,就可以谁请求成功就开始刷而不用等待所有 OK 才刷新)。CompletionService 接口如下:

        public interface CompletionService<V> {
            //同线程池接口方法含义 

            Future<V> submit(Callable<V> task);

            Future<V> submit(Runnable task, V result);

            // 阻塞等待获取下一个完成任务的结果 
            Future<V> take() throws InterruptedException;

            // 直接获取下一个完成任务的结果,如果没有已经完成的任务则返回null 
            Future<V> poll();

            // 最多等待timeout后返回,如果没有已经完成的任务则返回null 
            Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException;
        }

ExecutorCompletionService 实现类依赖于 Executor 完成实际的任务提交执行,自己主要负责结果的排队处理,AbstractExecutorService 的 invokAny 实现就依赖此类,ExecutorCompletionService 内部有一个额外的队列,每个提交给 Executor 的任务都是通过继承 FutureTask 封装过的,FutureTask 在任务结束后会回调 done 方法,所以 ExecutorCompletionService 就在继承 FutureTask 封装重写的 done 方法中,将当前 FutureTask 加入额外队列,然后我们通过其 take 或者 poll 方法获取的实质就是从这个额外队列中取数据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 网上一搜取消正在执行的异步任务,会出现很多Future,FutureTask相关的文章,最近我也用了一下Futur...
    zero_sr阅读 33,557评论 9 48
  • 一、并发 进程:每个进程都拥有自己的一套变量 线程:线程之间共享数据 1.线程 Java中为多线程任务提供了很多的...
    SeanMa阅读 7,534评论 0 11
  • 使用线程池的原因 无线创建线程的不足在生产环境中,为每一个任务都分配一个线程这种方法存在一些缺陷:线程生命周期的开...
    德彪阅读 3,873评论 0 1

友情链接更多精彩内容