jdk8的CompletionService

原创
2019/12/14 16:09
阅读数 92

jdk8的CompletionService

本质是一个阻塞队列,能够让先完成的任务先返回Future。当然,这有以下必要因素:

1.执行器的线程个数要充足,能够立即执行任务,而执行器的队列里面不存在等待执行的任务。

2.只能调用poll和take方法,才能先返回先执行完成的任务

submit方法跟普通的执行器的方法原理类似。

这个类是一次一消费类,执行完就可以放弃了。

内部原理,定义一个内部类,这个内部类覆盖done方法,当完成时,就把Future放到外部类的阻塞队列里面即可。

本质其实就是一个阻塞队列而已。

    public class Task implements  Callable<Integer>{

        private Integer no;

        public Task(Integer no) {
            this.no = no;
        }

        @Override
        public Integer call() {

            try {
                TimeUnit.SECONDS.sleep((long)no.intValue());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return this.no;
        }
    }
    public static void main(String[] args) {

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,2,60, TimeUnit.SECONDS,new ArrayBlockingQueue<>(100));

        CompletionService completionService = new ExecutorCompletionService(threadPoolExecutor);

        try{
           completionService.submit(new Task(Integer.parseInt("4")));
           completionService.submit(new Task(Integer.parseInt("1")));

           for(int i=0;i<2;i++){
               Future<Integer> f = completionService.take();
                   System.out.println(f.get());
           }
            threadPoolExecutor.shutdown();
        }catch (Exception e){
            e.printStackTrace();
        }
}
展开阅读全文
JDK
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部