关于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,是可以保证任务及时被执行的。
  • 0
    点赞
  • 3
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

韩运畅

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者