转自:
第四个构造器源码
corePoolSize:核心池的大小
默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数数目少于corePoolSize时,有新任务进来就新建一个线程,即使有的线程没事干,当线程池中的线程数目达到corePoolSize时,将到达的任务放在缓存队列中
可以理解为:队列没满时,线程最大并发数
maximumPoolSize:线程池最多线程数
表示在线程池中最多能创建多少个线程
可以理解为:队列满后,线程能够达到的最大并发数
keepAliveTime:空闲线程过多久被回收的时间限制
默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize
unit:keepAliveTime的时间单位
workQueue:阻塞队列,用来存放待执行的任务
工作队列的默认选项是 SynchronousQueue,它将任务直接提交给线程而不保持它们。在此,如果不存在可用于立即运行任务的线程,则试图把任务加入队列将失败,因此会构造一个新的线程。此策略可以避免在处理可能具有内部依赖性的请求集时出现锁。直接提交通常要求无界 maximumPoolSizes 以避免拒绝新提交的任务。
ArrayBlockingQueue(有界队列,基于数组,先进先出)
LinkedBlockingQueue(无界队列,基于链表,先进先出)
threadFactory:线程工厂,用来创建新线程
handler:饱和策略
当队列和线程池都满了(也就是说超过了maximumPoolSiz和workQueue),说明线程池处于饱和状态,那么必须采用一种策略来处理新任务
当然也可以根据具体场景需要实现RejectedExecutionHandler接口来自定义策略,如记录日志或持久化不能处理的任务
构造器的使用
newSingleThreadExecutor-->单线程线程池
newFixedThreadExecutor(n)-->固定数量线程池
newCacheThreadExecutor(推荐使用)-->缓存线程池
newScheduleThreadExecutor
大小无限制的线程池,支持定时和周期性的执行线程
常用方法之向线程池提交任务
提交不需要返回值的任务
提交需要返回值的任务
常用方法之关闭线程池