`
jokermanager
  • 浏览: 143728 次
  • 性别: 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(2.2 /3.1)

    backport-util-concurrent库,正如其名,是一种将Java 5及以上版本的并发特性“回移植”到Java 1.4及更早版本的工具,使得开发者能在较旧的Java环境中享受现代并发编程的优势。本文将深入探讨这个库的2.2和3.1两个...

    jdk-8u20-docs-all.zip

    - `java.lang.Thread`和`java.util.concurrent`:提供了多线程编程的支持,包括创建和管理线程、线程同步和并发工具。 4. **JDBC**: - `java.sql`:提供了与数据库交互的接口和类,如`Connection`、`Statement`...

    java-jdk1.6-jdk-6u45-windows-x64.zip

    4. 并发工具:提供了一些新的并发工具类,如`java.util.concurrent`包下的`CountDownLatch`、`CyclicBarrier`和`Phaser`,这些工具帮助开发者更高效地管理多线程程序。 5. JDBC增强:JDBC API进行了扩展,增加了对...

    jdk-17.0.1-doc-all.zip

    JDK 17.0.1是Java的一个长期支持(LTS)版本,它带来了诸多性能提升、新特性和安全性改进。JDK 17遵循每六个月发布一个新版本的节奏,为开发者提供了持续的创新和技术更新。作为LTS版本,它将获得更长时间的支持,...

    backport-util-concurrent-3.1.jar和geronimo-stax-api_1.0_spec-1.0.1.jar

    "backport-util-concurrent-3.1.jar"是Java.util.concurrent包的回移植版本,主要用于Java 5之前的JRE环境。它提供了与Java 5及更高版本相同的并发工具类,如线程池、Future、CyclicBarrier等。这些工具可以提高多...

    jdk-8u231-windows-x64.zip

    函数式接口是指只有一个抽象方法的接口,例如`java.util.function.Function`、`java.util.concurrent.Callable`等。这些接口可以与Lambda表达式结合,增强了Java的多态性。 3. **方法引用和构造器引用**:除了...

    jdk-6u45-linux-x64.bin

    5. **并发工具类库**:Java并发工具包(java.util.concurrent)在1.6版本中得到加强,增加了如`CountDownLatch`、`CyclicBarrier`、`Semaphore`等同步工具,便于多线程编程。 6. **XPath和XML处理**:JDK 1.6改进了...

    backport-util-concurrent-3.1.jar

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

    解决axis2-CodegenWizardPluginBUG- java.lang.reflect.InvocationTargetException

    1. `backport-util-concurrent-2.1-source.jar`:这是一个回退实现的并发工具库,主要用于在JDK版本较低的环境中提供Java 5及以上版本的并发API支持。 2. `geronimo-stax-api_1.0_spec-1.0.1.jar`:这是Apache ...

    Java API 文档 jdk-17.0.2-doc-all

    这份"jdk-17.0.2_doc-all"文档集全面覆盖了Java 17.0.2版本的特性,是理解、学习和使用Java编程语言的关键资源。 在Java 17.0.2中,我们可以找到以下几个关键的知识点: 1. **核心类库**:Java API文档首先会介绍...

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

    "JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...

    jdk-8u311-docs-all.zip

    2. **语言特性**:JDK 8引入了许多重要的新特性,如Lambda表达式,它简化了函数式编程;方法引用来代替匿名内部类;默认方法增强了接口;新的日期和时间API (`java.time` 包);以及Stream API,它提供了一种处理集合...

    离线JDK9中文版 | API_jdk-9.CHM

    5. **新引入的包**:如`java.nio.file.Paths`和`java.nio.file.FileSystems`,提供对文件系统路径的操作。 6. **I/O和NIO包**:如`java.nio`和`java.nio.channels`,包含非阻塞I/O操作。 7. **反射和注解处理**:...

    jdk-8u201-linux-x64_.tar.gz

    5. **日期和时间API**:在`java.time`包下,替代了过时的`java.util.Date`和`java.util.Calendar`,提供了更易用的API,如`LocalDate`, `LocalTime`, `LocalDateTime`等。 6. **默认方法**:在接口中添加的具有实现...

    jdk-api-1.8.CHM Java帮助手册中文版

    Java的并发编程模型在1.8中也得到了强化,`java.util.concurrent`包提供了许多高级的并发工具类,如`ExecutorService`、`Future`和`Callable`,以及线程池的管理。 **总结** Java JDK API 1.8 CHM中文版对于学习和...

    jdk8u171-linux-x64.tar.zip

    1. **Java 8**: Java 8是Java平台的重大更新,引入了许多新特性,如Lambda表达式、函数式接口、Stream API、新的日期和时间API以及默认方法等,这些都极大地提高了开发效率和代码的可读性。 2. **Lambda表达式**: ...

    jdk1.7官网最新版64位 jdk-7u80-windows-x64

    JDK 1.7,也称为Java 7,是Java编程语言的一个重大版本,它引入了许多新特性、改进和优化,提升了开发效率和代码性能。本篇将详细介绍JDK 1.7在64位操作系统上的最新版——`jdk-7u80-windows-x64`。 首先,64位版本...

    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....

Global site tag (gtag.js) - Google Analytics