线程池队列区别

Posted yslu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池队列区别相关的知识,希望对你有一定的参考价值。

线程池的三种队列区别:SynchronousQueue、LinkedBlockingQueue 和ArrayBlockingQueue

https://blog.csdn.net/qq_26881739/article/details/80983495

1.SynchronousQueue(CachedThreadPool) 类似交警只是指挥车辆,并不管理车辆
SynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者,必须等队列中的添加元素被消费后才能继续添加新的元素。
超出直接corePoolSize个任务,直接创建新的线程来执行任务,直到(corePoolSize+新建线程)> maximumPoolSize。不是核心线程就是新建线程。

2.LinkedBlockingQueue(single,fixed)类似小仓库,暂时存储任务,待系统有空的时候再取出执行
BlockingQueue是双缓冲队列。BlockingQueue内部使用两条队列,允许两个线程同时向队列一个存储,一个取出操作。在保证并发安全的同时,提高了队列的存取效率。
LinkedBlockingQueue是一个无界缓存等待队列。当前执行的线程数量达到corePoolSize的数量时,剩余的元素会在阻塞队列里等待。(所以在使用此阻塞队列时maximumPoolSizes就相当于无效了),每个线程完全独立于其他线程。生产者和消费者使用独立的锁来控制数据的同步,即在高并发的情况下可以并行操作队列中的数据。

3.ArrayBlockingQueue
ArrayBlockingQueue是一个有界缓存等待队列,可以指定缓存队列的大小,当正在执行的线程数等于corePoolSize时,多余的元素缓存在ArrayBlockingQueue队列中等待有空闲的线程时继续执行,当ArrayBlockingQueue已满时,加入ArrayBlockingQueue失败,会开启新的线程去执行,当线程数已经达到最大的maximumPoolSizes时,再有新的元素尝试加入ArrayBlockingQueue时会报错

 

以上是关于线程池队列区别的主要内容,如果未能解决你的问题,请参考以下文章

线程池的三种队列区别:SynchronousQueueLinkedBlockingQueue 和ArrayBlockingQueue

JAVA线程池shutdown和shutdownNow的区别

图解为什么要使用线程池?

线程进阶之线程队列线程池和协程

关闭线程池shutdown 和 shutdownNow 的区别

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段