一、构造函数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
corePoolSize 线程池维护的核心线程数。为什么这里说核心线程数而不是最小线程数是因为在线程池被创建后,并不会直接创建corePoolSize个线程,
而是等任务到来时临时创建。等按照需要创建了corePoolSize个线程之后,这些数量的线程即使闲置,也不会被线程池收回。这时即可以将这个值理解为线程池维护的最小线程数了。
maximumPoolSize 线程池维护的最大线程数。
keepAliveTime 当线程池中的线程数量大于corePoolSize,多出那部分数量的线程空闲keepAliveTime后会被收回。(线程池维护线程所允许的空闲时间)
unit keepAliveTime的时间单位。可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
workQueue 存放通过execute方法提交给线程等待执行的任务的队列。
threadFactory 负责给线程池创建线程的工厂。
handler 在当队列达到极限导致任务执行阻塞时执行的处理策略。handler有四个选择:ThreadPoolExecutor.AbortPolicy(抛出java.util.concurrent.RejectedExecutionException异常)。ThreadPoolExecutor.CallerRunsPolicy(重试添加当前的任务,他会自动重复调用execute方法)。ThreadPoolExecutor.DiscardOldestPolicy(抛弃旧的任务)。
ThreadPoolExecutor.DiscardPolicy(抛弃当前的任务)。
说明:
一个任务通过execute(Runnable)方法添加到线程池,任务就是一个Runnable类型的对象,任务执行的方法就是Runnable类型对象的run()方法。
1)ThreadPoolExecutor会根据corePoolSize和maximumPoolSize的值调整线程池中线程的数量。当通过ThreadPoolExecutor.execute方法向线程池提交一个新的任务时,如果线程池当前线程数量小于corePoolSize,就算有线程空闲,
也会在创建一个线程执行这个任务;如果线程池当前线程数量大于corePoolSize又小于maximumPoolSize,只有当可用线程不够的时候才会创建新的线程。如果不希望系统动态增减线程数量,则将corePoolSize和maximumPoolSize数值设置为一样的值。如果将maximumPoolSize设置为一个特别大的值如Integer.MAX_VALUE,则ThreadPoolExecutor成为了一个能够容纳大量并发任务的线程池。一般来说corePoolSize和maximumPoolSize是在构造ThreadPoolExecutor对象时设置好的,当仍然可以调用ThreadPoolExecutor.setCorePoolSize 和ThreadPoolExecutor.setMaximumPoolSize 方法修改这两个属性。
2)关于BlockQueue
当一个任务通过execute(Runnable)添加到线程池时:
a) 线程池中线程数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理刚添加的任务。
b) 线程池中线程数量等于于corePoolSize,但缓冲队列workQueue未满,任务放入缓冲队列
c)线程池中线程数量大于于corePoolSize,缓冲队列workQueue满,且线程池中线程数量小于maxmumPoolSize,建新的线程来处理被添加的任务
d) 线程池中线程数量大于于corePoolSize,缓冲队列workQueue满,且线程池中线程数量等于maxmumPoolSize,根据handle所指定的策略来处理任务
关于BlockQueue的选择,这篇文章分析的比较透彻
http://blog.csdn.net/feiyu8607/article/details/6872736
分享到:
相关推荐
1.资源简介:PyQt5中使用多线程模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时...2.适用人群:想学习PyQt5中多线程模块QThread和线程池ThreadPoolExecutor知识的人。
提供工厂方法来创建不同类型的线程池,这篇文章主要介绍了Java ThreadPoolExecutor 线程池的使用介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来...
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
主要介绍了Java线程池ThreadPoolExecutor原理及使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java分布式应用学习笔记07线程池应用
Reference: 《创建Java线程池》[1],《Java线程:新特征-线程池》[2], 《Java线程池学习》[3],《线程池ThreadPoolExecutor使用简介》[4],《Java5中的线程池实例讲解》[5],《ThreadPoolExecutor使用和思考》[6] ...
数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, 链阻塞队列 LinkedBlockingQueue,具有优先级的阻塞队列 PriorityBlockingQueue, 同步队列 ...文章知识点与官方知识档案匹配,可进一步学习相关知识
本书内容非常全面,涵盖了《Java编程思想》、《Java学习笔记》等书籍所有知识要点,并结合作者自己...线程池-ThreadPoolExecutor .....反射 ..........概述 ..........Class类 ..........类的加载 ..........操作对象
突击并发编程JUC系列-ThreadPoolExecutor 线程池 JVM系统学习之路系列 【JVM系统学习之路系列】 JVM 概述篇 【JVM系统学习之路系列】一篇看懂类加载 【JVM系统学习之路系列】运行时数据区概述和程序计数器 【JVM系统...
JAVA线程基本学习, JAVA多线程的特性= 线程池: 本质上是一个对象池, 用来管理线程资源. 在任务执行前, 需要从线程池中拿出线程来执行. 在任务执行完成之后, 需要把线程放回线程池. 线程池好处: 降低资源的消耗...
在调用构造函数后再定制ThreadPoolExecutor 扩展 ThreadPoolExecutor afterExecute(Runnable r, Throwable t) beforeExecute(Thread t, Runnable r) terminated 递归算法的并行化 构建并发应用程序...
主要给大家介绍了关于java线程池使用后到底要不要关闭的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
今天,我将带大家全部学习关于线程池的所有知识。 目录 1. 简介 2. 工作原理 2.1 核心参数线程池中有6个核心参数,具体如下 上述6个参数的配置 决定了 线程池的功能,具体设置时机 = 创建 线程池类对象时 传入 ...
: Netty 学习思维导图,包括基本概念,组件,设计模式,常见问题的分析 : Netty内存模型 源码分析 Java Core / J.U.C 源码分析之双亲委托模型以及如何破坏双亲委托 源码分析之JDBC实现原理与SPI机制 tomcat和...
学习时候,所做的一些笔记。方便之后复习查阅。 一. Notes for Algortihms 顺时针打印链表矩阵 链表中环的入口节点 树中两个节点的最低公共祖先 判断是否为平衡二叉树-解法二 机器人运动的范围 矩阵中的路径 滑动窗口...
这部分代码就不再追踪下去,有兴趣的读者可以自己打开源码分析,不必害怕,学习大神们的编码方式,看源码能让你学习到很多 } } private void runTask(Runnable task) { final ReentrantLock runLock = this....
牛客的代码leetcode代码区别 offer ...ThreadPoolExecutor: extendsTest: 继承练习 Guava:Guava学习 NIODemo:NIO练习 Redis: Redis学习记录 redispractice: 练习 SwordOffer: 剑指offer题目练习
线程池ThreadPoolExecutor ,先简单学习下这个线程池的使用 /** * Parameters: corePoolSize the number of threads to keep in the pool, even if they are idle, unless allowCoreThreadTimeOu
线程池中有6个核心参数,具体如下上述6个参数的配置决定了线程池的功能,具体设置时机=创建线程池类对象时传入ThreadPoolExecutor类=线程池的真正实现类开发者可根据不同需求配置核心参数,从而实现自定义线程池注:...
线程池ThreadPoolExecutor 并发编程 Lock 锁 Lock 可重入锁Reetrantlock 可重入读写锁ReetrantReadWriteLock Condition ReadWriteLock LockSupport 并发类编程工具 CountDownLatch CyclicBarrier Semaphore Exchange...