`
jokermanager
  • 浏览: 140419 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JDK5新特性--java.util.concurrent ExecutorCompletionSe

阅读更多

虑以下场景:浏览网页时,浏览器了5个线程下载网页中的图片文件,由于图片大小、网站访问速度等诸多因素的影响,完成图片下载的时间就会有很大的不同。如果先下载完成的图片就会被先显示到界面上,反之,后下载的图片就后显示。

Java的并发库CompletionService 可 以满足这种场景要求。该接口有两个重要方法:submit()和take()。submit用于提交一个runnable或者callable,一般会提 交给一个线程池处理;而take就是取出已经执行完毕runnable或者callable实例的Future对象,如果没有满足要求的,就等待了。 CompletionService还有一个对应的方法poll,该方法与take类似,只是不会等待,如果没有满足要求,就返回null对象。

package  concurrent;

import  java.util.concurrent.Callable;
import  java.util.concurrent.CompletionService;
import  java.util.concurrent.ExecutionException;
import  java.util.concurrent.ExecutorCompletionService;
import  java.util.concurrent.ExecutorService;
import  java.util.concurrent.Executors;
import  java.util.concurrent.Future;

public class  TestCompletionService  {
   public static  void  main ( String []  args throws  InterruptedException,
       ExecutionException  {
     ExecutorService exec = Executors.newFixedThreadPool ( 10 ) ;
     CompletionService<String> serv = 
       new  ExecutorCompletionService<String> ( exec ) ;

     for  ( int  index =  0 ; index <  5 ; index++ ) {
       final  int  NO = index;
       Callable<String> downImg =  new  Callable<String> () {
         public  String call ()  throws  Exception  {
           Thread.sleep (( long ) ( Math.random ()  10000 )) ;
           return  "Downloaded Image "  + NO;
         }
       } ;
       serv.submit ( downImg ) ;
     }

     Thread.sleep ( 1000  2 ) ;
     System.out.println ( "Show web content" ) ;
     for  ( int  index =  0 ; index <  5 ; index++ ) {
       Future<String> task = serv.take () ;
       String img = task.get () ;
       System.out.println ( img ) ;
     }
     System.out.println ( "End" ) ;
     // 关闭线程池
     exec.shutdown () ;
   }
}

运行结果:
Show web content
Downloaded Image 1
Downloaded Image 2
Downloaded Image 4
Downloaded Image 0
Downloaded Image 3
End

分享到:
评论

相关推荐

    JDK研究系列--》util.concurrent(java.util part3)

    合适研究底层研发员,但,一般程序员也必须掌握的要点 JDK研究系列--》util.concurrent(java.util part3)

    backport-util-concurrent-3.1.jar

    backport-util-concurrent-3.1.jar是一个Java库,它提供了一些并发工具类,用于简化多线程编程。这个库包含了许多实用的工具类,如`FutureTask`、`CountDownLatch`、`Semaphore`等,这些工具类可以帮助开发者更好地...

    backport-util-concurrent(2.2 /3.1)

    backport-util-concurrent(2.2 /3.1) 资源共享,有需要其他jar包的可以在评论留言,看到后我会陆续上传。

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用

    SSH整合rar包【齐全】

    backport-util-concurrent-3.1.jar barbecue-1.5-beta1.jar bcmail-jdk14-1.38.jar bcmail-jdk14-138.jar bcprov-jdk14-1.38.jar bcprov-jdk14-138.jar bcprov-jdk16-1.46.jar bctsp-jdk14-1.38.jar c3p0-0.9.1.2....

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介.doc

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介

    动画学习 java.util.concurrent并发工具包

    如何启动:以win7系统为例,最好jdk8 1.打开cmd,cd到jdk的path,本机是:cd C:\Java\jdk6\bin ...java -cp D:\javaConcurrentAnimated.jar vgrazi.concurrent.samples.launcher.ConcurrentExampleLauncher

    The java.util.concurrent Synchronizer Framework

    Doug Lea关于jdk里面并发同步器的实现。

    java.util.concurrent 实现线程池队列

    java.util.concurrent 使用jdk内置的包实现一个线程池的操作

    Java高性能线程库(java.util.concurrent包的补充)

    一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用。该类库不提供远程的消息功能,其设计的宗旨是实现一个内存中的消息传递机制. 主要特点有: * All ...

    出现java.util.ConcurrentModificationException 问题及解决办法

    主要介绍了出现java.util.ConcurrentModificationException 问题及解决办法的相关资料,需要的朋友可以参考下

    Redis客户端Redisson.zip

    java.util.SortedSet 分布式 java.util.Queue 分布式 of java.util.Deque 分布式 java.util.Map 分布式 java.util.concurrent.ConcurrentMap 通过TTL实现可重入 java.util.concurrent.locks.Lock 分布式 ...

    jdk 中文版

    java jdk api帮助文档中文版 JavaTM Platform Standard Ed. 6 所有类 软件包 java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd java.awt.event java.awt.font java.awt.geom ...

    java jdk-api-1.6 中文 chmd

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...

    JacORB安装包

    %JACORB_HOME%\lib\backport-util-concurrent.jar;%JACORB_HOME%\lib\idl.jar; %JACORB_HOME%\lib\jacorb.jar;%JACORB_HOME%\lib\logkit-1.2.jar; %JACORB_HOME%\lib\picocontainer-1.2.jar;%JACORB_HOME%\lib\slf4j...

    大厂真题之蚂蚁金服-Java高级.zip

    jdk1.7 到 jdk1.8 Map 发生了什么变化(底层)? 1.8 之后 hashMap 的数据结构发生了变化,从之前的单纯的数组+链表结构变成...解决方案是 jdk 的 ConcurrentHashMap,位于 java.util.concurrent 下,专门 解决并发问题。

    JavaSE-6.0-英文手册(2008/11/30_FullUpdate)

    java.util.concurrent.atomic java.util.concurrent.locks java.util.jar java.util.logging java.util.prefs java.util.regex java.util.spi java.util.zip javax.accessibility javax.activation javax....

    jdk-14_linux-x64_bin.rpm

    总共 16 个新特性如下: 305:Pattern Matching for instanceof (Preview) 为 instanceof 运算符引入模式匹配(预览阶段) 通过模式匹配,开发者可以用更简洁和更安全的方式来表达通用的程序逻辑。instanceof...

    [Java参考文档].JDK_API 1.6

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java...

    java api最新7.0

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java...

Global site tag (gtag.js) - Google Analytics