CompletionService的介绍和使用
本文由发表于5年前 | Java基础 | 评论数 1 |  被围观 8,366 views+

public interface CompletionService<V>

将生产新的异步任务与使用已完成任务的结果分离开来的服务。生产者 submit 执行的任务。使用者 take 已完成的任务,并按照完成这些任务的顺序处理它们的结果。例如,CompletionService 可以用来管理异步 IO ,执行读操作的任务作为程序或系统的一部分提交,然后,当完成读操作时,会在程序的不同部分执行其他操作,执行操作的顺序可能与所请求的顺序不同。

通常,CompletionService 依赖于一个单独的 Executor 来实际执行任务,在这种情况下,CompletionService 只管理一个内部完成队列。ExecutorCompletionService 类提供了此方法的一个实现。

内存一致性效果:线程中向 CompletionService 提交任务之前的操作 happen-before 该任务执行的操作,后者依次 happen-before 紧跟在从对应 take() 成功返回的操作。

// 这个东西的使用上很类似于CallableFutureTest,不同的是,它会首先取完成任务的线程。
public class CompletionServiceTest {
    public static void main(String[] args) throws InterruptedException,  
    ExecutionException {
        ExecutorService exec = Executors.newFixedThreadPool(10);  
        // 创建CompletionService
        CompletionService<String> serv =  
        new ExecutorCompletionService<String>(exec);
        for (int index = 0; index < 5; index++) {  
            final int NO = index;  
            // Callable 接口类似于 Runnable
            Callable<String> downImg = new Callable<String>() {  
                public String call() throws Exception {  
                    Thread.sleep((long) (Math.random() * 10000));  
                    return "Downloaded Image " + NO;  
                }  
            };
            // 提交要执行的值返回任务,并返回表示挂起的任务结果的 Future。在完成时,可能会提取或轮询此任务。
            serv.submit(downImg);  
        }
        Thread.sleep(1000 * 2);  
        System.out.println("Show web content");
        for (int index = 0; index < 5; index++) {
            // 获取并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。
            Future<String> task = serv.take();
            // 如有必要,等待计算完成,然后获取其结果。
            String img = task.get();
            System.out.println(img);
        }
        System.out.println("End");
        // 关闭线程池 
        exec.shutdown();  
    }  
}
除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/the-introduction-and-use-of-completionservice.html
关键字:
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2012 7/30
文章评论
    一条评论
  1. itbokeyun 2015年04月10日09:18:59  #-49楼 回复 回复

    // 如有必要,等待计算完成,然后获取其结果。
    这句话说得不对,如果真是这样的话,何必使用CompletionService呢?
    Future task = serv.take();
    既然CompletionService的take方法返回了Future对象,那么这个对象一定是执行完成的了

    /**
    * Retrieves and removes the Future representing the next
    * completed task, waiting if none are yet present.
    *
    * @return the Future representing the next completed task
    * @throws InterruptedException if interrupted while waiting
    */
    Future take() throws InterruptedException;

给我留言

有人回复时邮件通知我
Java基础的相关文章
随机文章 本月热门 热评
1 分享两款Javascript在线IDE 2013/1/11
2 学习计算机的一些方法,避免误入歧途 2011/5/4
3 【转】苹果新品发布会:难得的皆大欢喜 2013/10/23
4 Javascript笔记 – Javascript中的语言特性和数据类型 2012/5/22
5 Struts2中的Unable to load configuration错误的分析与解决方法 2011/5/22
6 Apache CXF中jaxrs.serviceClasses多个Service的配置方法 2012/4/28
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.