以排队买票来理解线程池ThreadPoolExecutor

首先我们需要了解线程池的主要成员变量:

成员变量:
首先是最重要的3个:
corePoolSize:核心池大小
maximumPoolSize :最大线程池大小
keepAliveTime :非核心线程存活时间
这三个是构造线程池对象必须要输入的三个参数
poolsize :线程池当前的线程数
unit :用于指定keepAliveTime的时间单位,常用的有TimeUnit.MILLISECONDS,TimeUnit.SECONDS(秒), TimeUnit.MINUTES(分钟)
allowCoreTheadTimeOut :是否允许为核心线程设置存活时间
首先我们来理解线程池最重要的4个参数:corePoolSize、maximumPoolSize 、keepAliveTime 、poolSize 理解了这4个参数,其他的部分就不难理解了。

       我们先假设一个场景:火车站卖票,假设火车站有10个窗口,线程池初始化以后这10个窗口都处于工作状态,那么核心池大小corePoolSize就是10,这个时候,有8个人来买票,那么这8个人在窗口有空闲的情况下会分别在8个窗口买票,应该不会有人在有窗口空闲的时候还去排在别人后面吧!那么这8个人正在买票的这个过程就可以理解为8个线程,此时poolSize 等于8,这个时候又来了更多的人买票,当所有窗口都被占满的时候,第11个人就只能排队了,第11个人来了,而其他人还没买完,那他只能等着,来都来了,那就排队买票呗!那么他排队的这个位置就叫做队列,这个时候,人越来越多,火车站每个窗口都排成了长长的一条龙。
       火车站站长定睛一看,顿感大事不妙:咱们这个火车站等待区只能容纳100个人(队列的上限),再来就要挤爆了,平时按照取票的速度怎么也不会累积这么多的人,可到了春运时期,人流量增多,这可咋整呢?于是站长立即启动应急预案,再增加5个额外的售票窗口,以缓解人流量,那么此时maximumPoolSize就等于15,而poolSize此时等于15,但是这个时候人还是越来越多,火车站大厅里面站满了整整115个人,都等着买票,这时候又来了一位老乡跟站长说我要买票,站长实在没辙了,跟他说火车站没位置了,你等会再来吧!并且抛出RejectedExecuteException异常。
以上就是线程池调度的基本策略,当任务到达时,如果线程数小于corePoolSize,那么就会创建新的线程来执行该任务,如果线程数等于corePoolSize,那么新来的任务就只能在队列中等待,如果这个时候队列也满了,再来任务的话,就会“启动应急预案”开启新的线程,但总所有的线程数加起来不能超过maximumPoolSize 。

       我们用一个例子来感受一下任务增多时,线程池调度的基本策略:

public class ThreadTest{
   

    private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 4000,
            TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值