线程池的3种队列区别和使用: ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue

当创建线程池时,通常不使用Executors进行创建,而是使用new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,new ThreadPoolExecutor.AbortPolicy())创建,以防止造成内存溢出,并了解线程池创建的大小,线程常用的3种队列的区别

1.ArrayBlockingQueue

ArrayBlockingQueue是一个有界缓存等待队列。可以指定缓存队列的大小,当线程数已经达到最大的maximumPoolSizes时,再有新的元素尝试加入ArrayBlockingQueue时会报错。

2.LinkedBlockingQueue 

LinkedBlockingQueue是一个无界缓存等待队列。当前执行的线程数量达到corePoolSize的数量时,剩余的元素会在阻塞队列里等待。(所以在使用此阻塞队列时maximumPoolSizes就相当于无效了),每个线程完全独立于其他线程。生产者和消费者使用独立的锁来控制数据的同步,即在高并发的情况下可以并行操作队列中的数据。

注:这个队列需要注意的是,虽然通常称其为一个无界队列,但是可以人为指定队列大小,而且由于其用于记录队列大小的参数是int类型字段,所以通常意义上的无界其实就是队列长度为 Integer.MAX_VALUE,且在不指定队列大小的情况下也会默认队列大小为 Integer.MAX_VALUE

3.SynchronousQueue

SynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者,必须等队列中的添加元素被消费后才能继续添加新的元素。
使用SynchronousQueue阻塞队列一般要求maximumPoolSizes为无界(Integer.MAX_VALUE),避免线程拒绝执行操作。

使用说明:通常使用ArrayBlockingQueue就满足要求了,若在高并发下,建议使用LinkedBlockingQueue 

原文地址:https://www.cnblogs.com/e-x-c-e-ption/p/14532486.html