`

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  
来看看并发包,与线程池。

相关推荐

    JDK concurrent

    标题 "JDK concurrent" 指的是Java开发工具包(JDK)中的并发编程相关知识。并发编程是在多线程环境中同时执行多个任务的技术,它在现代计算机系统中至关重要,尤其是在多核处理器和高并发应用中。Java JDK提供了一...

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

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

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

    JDK 1.5引入的`java.util.concurrent`包极大地简化了并发编程,提供了高效、可控的线程池管理。熟练掌握这些工具,能帮助开发者编写出更加稳定、高效的多线程应用程序。通过深入学习和实践,可以更好地理解和利用...

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

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

    JDK自带线程池分析

    JDK 自带线程池是 Java 语言中用于管理和执行线程的工具,旨在提高多线程编程的效率和灵活性。本文将详细介绍 JDK 自带线程池的组成、创建方法、优点和常见应用场景。 多线程技术 多线程技术是指在一个处理器单元...

    jdk1.6jar包

    9. **并发编程工具**:提供了一系列的并发编程工具,如`java.util.concurrent`包,包含线程池、并发容器和并发工具类,方便开发者构建高并发应用。 10. **JMX (Java Management Extensions)**:增强了对Java应用...

    JDK1.5线程池源码及详细注释

    JDK 1.5引入了java.util.concurrent包,其中包含了线程池的实现,使得并发编程更加便捷和高效。线程池的核心在于它的设计策略,包括核心线程数、最大线程数、线程存活时间、工作队列以及拒绝策略。 线程池的主要类...

    jdk5.zip

    在并发编程方面,JDK 5添加了java.util.concurrent包,包含了线程池、并发容器和同步工具类等高效并发工具。例如,ExecutorService和Future接口提供了异步执行任务的能力,而ConcurrentHashMap则是一种线程安全的...

    自定义实现Java线程池1-模拟jdk线程池执行流程1

    首先,Java中的线程池设计始于JDK 5.0,主要通过`java.util.concurrent`包中的`Executor`接口实现。这个接口仅有一个`execute()`方法,用于提交执行任务。我们也将遵循这个设计,实现一个简单的线程池类`...

    JDK1.8源码,包含sun包,java包,org包等,完整的源码

    3. 学习并发编程,如`java.util.concurrent`包中的线程池和同步工具类。 4. 理解Java集合框架的设计与实现,包括泛型、迭代器、比较器等。 5. 研究高级特性,如Lambda表达式、Stream API和Optional类,这些都是JDK...

    JDK13 API 中文 文档.CHM

    3. **并发库**:包括`java.util.concurrent`包中的线程池、锁、同步器等组件的优化,提升了并发性能和易用性。 4. **日期与时间API**:`java.time`包中的类如`LocalDate`, `LocalTime`, `LocalDateTime`等得到了...

    java_jdk_api中文文档 部分常用类包

    8. **java.concurrent**:并发和多线程处理,包含线程(`Thread`)、同步机制(如`synchronized`、`Lock`)、线程池(`ExecutorService`)和并发工具类(如`Semaphore`、`CountDownLatch`)。 9. **java.time**:...

    jdk-1_5_0_22-linux-amd64.bin

    9. **并发工具类**:如`java.util.concurrent`包,包含线程池、并发集合等,改善了多线程编程的效率和易用性。 10. **NIO.2**(非阻塞I/O):虽然Java 5中引入的是NIO(New Input/Output),但NIO.2在后续版本中...

    Java线程池使用说明

    在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,其中包含了一系列关于线程池的接口和类,极大地丰富了线程池的应用场景和管理方式。 线程池的主要作用是限制系统...

    JAVA JDK1.6 API中文帮助文档

    4. **并发编程增强**:加入了`java.util.concurrent`包,提供了线程池、并发集合等高级并发工具,提升了多线程编程的效率和可管理性。 5. **NIO.2**:新I/O(New I/O)API在1.6版本中进一步完善,提供了文件系统...

    JDK6API中文参考

    4. **多线程**:`java.lang.Thread`和`java.util.concurrent`包提供了线程管理和并发控制,如线程的创建、同步、守护线程、线程池等。 5. **集合框架**:JDK 6对集合框架进行了优化,如增强的泛型支持,使得类型...

    JDK6API中文参考手册

    12. **并发工具类**:Java并发包(java.util.concurrent)在JDK6中得到了丰富,提供了并发容器如ConcurrentHashMap,以及并发工具如CountDownLatch、CyclicBarrier等,便于编写高效、线程安全的代码。 13. **日志...

    backport-util-concurrent(2.2 /3.1)

    - backport-util-concurrent也实现了Future和Callable接口,尽管在Java 5中它们被引入为标准库的一部分。这些接口允许异步计算并获取结果,Callable可以返回一个结果,而Future则提供了检查任务完成状态和获取结果...

    JDK_API_1.6_中文版本CHM

    2. `java.util.concurrent`:并发工具包,包含线程池、同步容器、并发集合等,简化多线程编程。 3. `java.awt`和`javax.swing`:图形用户界面(GUI)编程的支持,用于创建桌面应用。 4. `java.sql`:数据库连接和...

    JDK 11 API中文帮助文档.rar

    3. **并发编程**:`java.util.concurrent`包提供了线程池、并发容器和同步工具类,如ExecutorService、ConcurrentHashMap等。 4. **I/O流**:`java.nio`包提供了非阻塞I/O操作,包括通道(Channel)、缓冲区...

Global site tag (gtag.js) - Google Analytics