java concurrent-ThreadPoolExecutor

一、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了,那么便会正常终止退出该线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值