`
zpball
  • 浏览: 915614 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

concurrent包小结(转)

    博客分类:
  • J2EE
 
阅读更多
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类图:





  • 大小: 502.1 KB
分享到:
评论

相关推荐

    【计算机专业-Andorid项目源码100套之】Android异步加载图像小结 (含线程池,缓存方法)

    本资料包“Android异步加载图像小结(含线程池,缓存方法)”正是针对这一主题进行深入探讨的项目源码集合,适合Android开发者学习和参考。 首先,我们要理解异步加载图像的基本原理。在Android中,通常会使用...

    Java基础知识小结

    ### Java基础知识小结 #### 1.1 `getPath()`、`getAbsolutePath()`、`getCanonicalPath()`的区别 在Java中,处理文件路径时经常会用到`getPath()`、`getAbsolutePath()`以及`getCanonicalPath()`这三个方法。它们...

    Properties类小结

    由于继承自Hashtable,它支持同步操作,但在处理大量并发时,建议使用Properties的子类`java.util.concurrent.ConcurrentProperties`,以提高性能。 Properties类的主要方法有以下几个: 1. `load(Reader reader)`...

    Android异步加载图像小结 (含线程池,缓存方法).rar

    2. **在Android中使用线程池**:可以使用`java.util.concurrent`包下的`ExecutorService`接口及其实现类如`ThreadPoolExecutor`。通过配置核心线程数、最大线程数、线程存活时间等参数,可以有效地管理并发任务。 3...

    Android--开发--异步加载图像小结 (含线程池,缓存方法).rar

    在Android中,我们可以使用`java.util.concurrent`包下的`ExecutorService`接口及其实现类来创建线程池。例如,`ThreadPoolExecutor`允许我们自定义核心线程数、最大线程数、线程存活时间等参数,从而更灵活地管理...

    Tuxedo学习

    2. **Concurrent (并发式)**: 当有新请求到达时,服务器进程创建一个新的进程或线程来处理该请求,自身则继续监听新连接。 在Tuxedo中,由于需要处理大量并发请求,单纯使用迭代式或并发式都不够高效,因此采用了...

    CVS快速入门指南

    小结 CVS作为早期的版本控制系统,虽然已被更现代的工具如Git取代,但其基本原理和操作模式在现代版本控制系统中依然适用。通过理解和实践CVS,你可以更好地理解版本控制的重要性,从而提高团队开发的效率和质量。...

    Java 语言程序设计:第8章线程.ppt

    【Java 语言程序设计:第8章线程】 ...8.4 本章小结 本章详细介绍了Java多线程编程的基本概念、方法和技巧,包括线程的创建、同步控制、通信以及生命周期管理。掌握这些知识对于编写高效、安全的并发程序至关重要。

    citrix license激活文档

    #### 小结 完成以上步骤后,您就成功地激活了Citrix License。这个过程虽然看似简单,但每一步都需要谨慎操作,以确保许可证的准确性和有效性。Citrix License的激活不仅关系到软件功能的正常使用,还直接影响着...

    java线程池封装j

    小结 Java线程池封装是Java并发编程中重要的一环,合理的线程池配置和封装能显著提升程序的性能和稳定性。理解线程池的工作原理,根据业务需求选择合适的参数,以及正确处理拒绝策略,都是实现高效并发处理的关键...

    java面试精品全集[线程部分]

    ### 小结 本文通过对Java线程相关的知识点进行了详细的阐述,旨在帮助读者更好地理解Java线程的运作机制以及线程间的通信与协作方式。希望读者能够通过本文的学习,掌握Java多线程编程的基础知识,并能够在实际开发...

    java实现守护进程,有单独的监听进程, 两个或多个进程,两个或多个jvm

    Java中的`java.lang.Runtime`和`java.lang.ProcessBuilder`类可以帮助我们启动新的进程,而`java.util.concurrent`包下的线程类则可以用来创建守护线程。 首先,让我们了解如何创建一个监听进程。监听进程通常是...

Global site tag (gtag.js) - Google Analytics