背景知识;
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失败( 把这种情况代入到线程池中来,那么线程池就会为这个任务创建新的线程)
如下图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201030214656620.png#pic_center)
问题:CachedThreadPool为何使用的是SynchronousQueue?
不能使用size大于0的arrayblockingqueue的原因在于,只来了一个任务,根据线程池运行原理,那个任务会被放入工作队列,如果后续一直没有任务,那么他就会一
直躺尸。那size==0呢,这时候每个任务都会新创建一个线程,线程池失去了节省线程创建与销毁的次数的意义。
整体来看,对于核心线程数为0的情况,arrayblockingqueue的offer只保证任务被存入进去但是不能保证任务何时被执行,而SynchronousQueue的offer失败代表着,
这个任务在时间t内没有被take,是可以保证任务及时被执行的。