• 【Java并发核心六】CompletionService


    CompletionService 接口的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样就可以将执行任务与处理任务分离开。

    CompletionService 仅有一个实现类 ExecutorCompletionService,需要依赖Executor对象,其大部分实现是使用线程池 ThreadPoolExecutor实现的。

    构造方法有两个

    // Linkedblockingqueue作为任务完成队列
    ExecutorCompletionService(Executor executor)    
    
    
    // 将所提供队列作为任务完成队列
    ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue) 

    使用实例:

         final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    
            CompletionService<String> csv = new ExecutorCompletionService<String>(Executors.newFixedThreadPool(10));
    
            // 此线程池运行5个线程
            for (int i = 0; i < 5; i++) {
                final int index = i;
                csv.submit(new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        System.out.println("Thread-" + index + "-begin-" + sf.format(new Date()));
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("Thread-" + index + "-end-" + sf.format(new Date()));
                        return "index-" + index;
                    }
    
                });
            }
    
            try {
                Future<String> f = csv.poll(); // poll方法 返回的Future可能为 null,因为poll 是非阻塞执行的
                if (f != null) {
                    System.out.println(f.get());
                } else {
                    System.out.println("使用poll 获取到的Future为 null");
                }
            } catch (Exception e1) {
                e1.printStackTrace();
            }
    
            for (int i = 0; i < 5; i++) {
                try {
                    // csv.take() 返回的是 最先完成任务的 Future 对象,take 方法时阻塞执行的
                    System.out.println(csv.take().get());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

    运行结果:

    这里有两个方法:

    take()    返回的是 最先完成任务的 Future 对象,take() 方法时阻塞执行的

    pool()    返回的Future可能为 null,因为poll() 是非阻塞执行的。

  • 相关阅读:
    751时尚公开课(三)宋杰林:时尚大跃进_豆瓣
    第九课堂-经验与技能分享交易网站
    751D·PARK北京时尚设计广场_百度百科
    2014马上有乐趣 每周六免费服装缝纫体验课_豆瓣
    设计工作室寻求合作
    【基础穿搭法】关于穿衣显高和好看的三个小技巧。(请深爱)
    给快播指一条生路:转型会员付费吧
    美华美依 | 创业谱
    服装配饰_MAVIN MARVY 高级服装定制_西服定制_衬衫定制_西装定制
    探索者系列_百度百科
  • 原文地址:https://www.cnblogs.com/klbc/p/9794760.html
Copyright © 2020-2023  润新知