`

JDK5中的concurrent包、线程池

    博客分类:
  • JAVA
阅读更多

concurrent并发包里面几个重要的接口有:Executor、ExecutorService, ScheduledExecutorService
重要的实现类有:ScheduledThreadPoolExecutor, ThreadPoolExecutor
关于这几个接口和实现类的类图可以参见文档最后的UML图,图中对一些比较重要的属性、方法进行红色标识,可以重点关注;

先来说说java.util.concurrent.ThreadPoolExecutor ,也就是我们经常说到的线程池,通过该类,应用可以直接拿来使用,只要在初始化时设置不同的参数即可;其主要的参数有以下几个:

  • corePoolSize : 线程池维护线程的最少数量
  • maximumPoolSize :线程池维护线程的最大数量
  • keepAliveTime : 线程池维护线程所允许的空闲时间
  • unit : 线程池维护线程所允许的空闲时间的单位
  • workQueue : 线程池所使用的缓冲队列
  • handler : 线程池对拒绝任务的处理策略

一个任务通过execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是Runnable类型对象的run()方法;注意:是Runnable,而不是Thread

当一个任务通过execute(Runnable)方法欲添加到线程池时:

  • 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
  • 如果此时线程池中的数量等于corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列。
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过handler所指定的策略来处理此任务。
  • 从上面可以看出线程池中处理任务的优先级为:
    核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。

默认handler有四个选择,当然也可以自行扩展,但是要特别小心:

  • ThreadPoolExecutor.AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常;
  • ThreadPoolExecutor.CallerRunsPolicy:主线程直接尝试执行该任务;当线程池中可加入时,将任务添加到线程池中;该操作会重复执行,可以有效降低主线程将任务加入到线程池的速度;
  • ThreadPoolExecutor.DiscardOldestPolicy:直接抛弃旧的任务,即把线程池内最早加入队列的线程抛弃;
  • ThreadPoolExecutor.DiscardPolicy:直接抛弃当前的任务;

再来说说java.util.concurrent.ScheduledThreadPoolExecutor ,此类是ThreadPoolExecutor的子类,所以以上我们描述的特性他都具备;除此之外,他还有一些自己特有的属性和方法:

  • schedule(Runnable command, long delay, TimeUnit unit)
    该方法创建并执行在给定延迟后启用的一次性任务;
  • scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
    该方法创建并执行一个在给定初始延迟后首次启用的定期任务,后续任务具有指定的周期;也就是将在initialDelay后开始执行,然后在initialDelay+period 后执行,接着在initialDelay + 2 * period 后执行,依此类推。
  • scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
    该方法创建并执行一个在给定初始延迟后首次启用的定期任务,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。

对于concurrent包在Spring中也进行了很多的封装,对于一些可以采用FixedRate 或者FixedDelay 来进行调度的任务,非常的方便,相比较于Quartz的实现,在配置文件方面要减少很多,有兴趣的同学可以参考Spring文档中的《第23章 Spring中的定时调度和线程池》,重点关注两个类:
org.springframework.scheduling.concurrent.ScheduledExecutorFactoryBean
org.springframework.scheduling.concurrent.ScheduledExecutorTask
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor

 

附:concurrent包中几个核心接口、类的UML类图:


知识容易遗忘,这里作为一个备份手册粘贴于此,感谢:http://www.alisdn.com/wordpress/?p=1133

  • 大小: 502.1 KB
分享到:
评论
3 楼 wsh525354 2013-07-18  
受益匪浅,菜鸟学习了
2 楼 xmgestapo 2011-12-19  
顶一个
1 楼 elf8848 2011-02-26  
来看看并发包,与线程池。

相关推荐

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

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

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

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

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

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

    jdk1.5 线程并发与线程池的使用

    整理的一些资料,jdk1.5新增加对线程并发的处理类,可以学习一下

    java线程池的使用方式

    介绍了java线程池的使用方式。 线程的使用在java中占有极其重要的地位,...Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用。为我们在开发中处理线程的问题提供了非常大的帮助。

    Java线程池文档

    Reference: 《创建Java线程池》[1],《Java线程:新特征-线程池》[2], 《Java线程池学习》[3],《线程池ThreadPoolExecutor使用简介》[4],《Java5中的线程池实例讲解》[5],《ThreadPoolExecutor使用和思考》[6] ...

    concurrent 多线程 教材

    33 Java 理论与实践 JDK 5_0 中更灵活、更具可伸缩性的锁定机制.mht 34 Java 理论与实践 流行的原子.mht 35 Java 理论与实践 非阻塞算法简介.mht 36 Java 理论与实践 处理 InterruptedException.mht 37 Java ...

    backport-util-concurrent-3.1.jar

    2. 丰富的功能:backport-util-concurrent-3.1.jar提供了许多实用的并发工具类,涵盖了多线程编程的各个方面,如任务调度、同步控制、线程池等。 3. 高性能:这个库的实现经过了优化,可以在高并发场景下提供良好的...

    并发容器和线程池,java并发编程3

    JDK提供的这些容器⼤部分在java.util.concurrent包中。我们挑选出⼀些⽐较有代表性的并发容器 1 类,来感受⼀下JDK⾃带的并发集合带来的“快感”。 ConcurrentLinkedQueue是⼀个基于链接节点的⽆界线程安全队列,它...

    java8源码-SpringTree:互联网通用技术

    5:Concurrent 并发工具包 ThreadPoolExcutor线程池 6:Fork/Join JDK 1.7提供的多线程框架已经与JDK 1.8 lamda的关系 采用工作窃取模式(当前线程任务执行完成,可窃取其他线程的执行任务),将大任务分解成多个小...

    java数据分析源码-javaModel:java高级基础知识总结,算法,数据结构,多线程,jvm优化,spring源码分析,java新特性等

    一、多线程高并发(concurrent、jvm包) 1.JUC多线程及高并发 1.1 多线程集合 1.2 cas 1.3 锁 1.4 队列 1.5 线程池 2.JVM+GC解析 demo 二、JDK8新特性(lamp包) 1.四大函数式接口 2.方法引用 3.构造器引用 4.数组...

    JAVA面试题最全集

    37.classloader中,JDK的API、Classpath中的同web-inf中的class加载方式有什么区别? 38.列举三种以上垃圾回收算法,并比较其优缺点? 39.编写代码实现一个线程池 40.描述一下JVM加载class文件的原理机制? 41....

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics