码迷,mamicode.com
首页 > 编程语言 > 详细

Java多线程与并发库高级应用-Callable与Future的应用

时间:2016-11-07 07:42:23      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:let   ack   system   提交   int   executor   public   sub   ring   

Callable这种任务可以返回结果,返回的结果可以由Future去拿

>Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的。

>CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象。

  好比我同时种了几块地的麦子,然后就等待收割。收割时,则是那块先成熟了,则先去收割哪块麦子。

Future<String> future = threadPool.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(2000);
                return "hello";
            }
        });
        System.out.println("等待结果");
        try {
            System.out.println("拿到结果: "+future.get());
        } catch (Exception e) {
            e.printStackTrace();
        }

这种发方式是Future去主动询问Callable有没有产生结果

 

>CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象。

ExecutorService executor = Executors.newFixedThreadPool(10);
        CompletionService<Integer> completionService = new ExecutorCompletionService<>(executor);
        for(int i = 0;i<10;i++){
            final int seq = i;
            completionService.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    Thread.sleep(new Random().nextInt(5000));
                    return seq;
                }
            });
        }
        for(int i = 0;i<10;i++){ //等待获取结果
            try {
                System.out.println(completionService.take().get());
            } catch (Exception e) {
                e.printStackTrace();
            };
        }

 

Java多线程与并发库高级应用-Callable与Future的应用

标签:let   ack   system   提交   int   executor   public   sub   ring   

原文地址:http://www.cnblogs.com/wq3435/p/6037080.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!