关于CachedThreadPool为何使用SynchronousQueue的思考

背景知识;
CachedThreadPool:核心线程数为0,最大线程数为Integer.MAXVALUE。cache是指的线程。
CachedThreadPool应对的是并发数高低非常不稳定的情景,所以核心线程数为0,最大线程数设置的非常大。
SynchronousQueue:是一个不存储数据的阻塞队列,每个take必须等待一个put 操作,反之每个put必须等待一个take 操作。但SynchronousQueue的size不是0,
                他只是不存储数据,而是去维护一组阻塞的线程。SynchronousQueue最重要的操作是offer与poll,他可以设置等待时间,一个线程调用offer方法,会在进
                行休眠,SynchronousQueue用队列维护因put休眠的线程或者因poll休眠的线程。当一个线程因put而阻塞时,如果在超时时间内被一个线程take,那么该       
                线程被唤醒并且put成功,反之offer失败( 把这种情况代入到线程池中来,那么线程池就会为这个任务创建新的线程)
如下图

在这里插入图片描述

问题:CachedThreadPool为何使用的是SynchronousQueue?
不能使用size大于0的arrayblockingqueue的原因在于,只来了一个任务,根据线程池运行原理,那个任务会被放入工作队列,如果后续一直没有任务,那么他就会一
直躺尸。那size==0呢,这时候每个任务都会新创建一个线程,线程池失去了节省线程创建与销毁的次数的意义。

整体来看,对于核心线程数为0的情况,arrayblockingqueue的offer只保证任务被存入进去但是不能保证任务何时被执行,而SynchronousQueue的offer失败代表着,
这个任务在时间t内没有被take,是可以保证任务及时被执行的。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值