一、ThreadPoolExecutor注意的点:
1.1 ctl(state:3|worker_num:29):
1.1.1 state:线程池状态,32位前三位
RUNNING(111),SHUTDOWN(000),STOP(001),TIDYING(010),ETRMINATED(011)
1.1.2 worker_num:线程池中工作线程的数量,32位的后29位
1.2 参数
1.2.1 corePoolSize 最大空闲的线程数量
1.2.2 maximumPoolSize 最大可执行的线程数量,当空闲的时候,会削减至corePoolSize
1.2.3 keepAliveTime 可理解为当超过corePoolSize,多出的线程最大空闲时间
1.2.4 workQueue 任务队列
二、Fixed ThreadPoolExecutor-固定线程池模式
2.1 参数设置
corePoolSize等于maximumPoolSize
workQueue为LinkedBlockingQueue(双向链表的阻塞队列)
2.2 执行流程
1) 当提交任务execute时,如果当前线程池的数量少于corePoolSize,那么会创建新的线程到线程池中并完成该任务
2)如果当前线程池的数量不少于corePoolSize的时候,会将任务加入到LinkedBlockingQueue阻塞队列中,然后队列会唤醒因调用take阻塞的线程
3)线程池中已经完成任务空闲线程,会调用LinkedBlockQueue的take获取队列中排在第一个的任务,如果当前没有任务,线程会被阻塞,直到有任务加入到队列中将其唤醒
三、Cache ThreadPoolExecutor-动态线程池模式
3.1 参数设置
corePoolSize设置为非0值
maximumPoolSize设置为大于等于corePoolSize的值
keepAliveTime 设置非0时间
workQueue设置为SynchronousQueue队列
3.2 执行流程
1)当提交任务execute时,如果当前线程池数量小于corePoolSize,那么会创建新的线程到线程池中,并完成任务
2)当前线程池数量不少于corePoolSize,会尝试调用SynchronousQueue的offer到队列中,但是由于SynchronousQueue没有队列容量,因此只有当有线程正在调用poll来等待获取任务时,该offer才会生效
3)对于2)中的offer添加到队列如果失败,则表明当前线程池中的所有线程都是繁忙的,那么如果当前线程池的数量小于maximumPoolSize,则会创建新的线程到线程池中,并完成任务
4)如果当前线程池的数量不少于maximumPoolSize,会拒绝任务,并抛出异常
5)线程池中的已完成任务的线程时尝试调用SynchronousQueue的poll方法,并尝试等待最长keepAliveTime时间,如果到达时间后,仍没有任务可以获取到(即表示已经空闲了keepAliveTime的时间),并且当前的线城池的线程数量已经大于corePoolSize了,那么便会正常终止退出该线程