线程池的三种队列区别:SynchronousQueue、LinkedBlockingQueue 和ArrayBlockingQueue[通俗易懂]

线程池的三种队列区别:SynchronousQueue、LinkedBlockingQueue 和ArrayBlockingQueue[通俗易懂]使用方法:privatestaticExecutorServicecachedThreadPool=newThreadPoolExecutor(4,Runtime.getRuntime().availableProcessors()*2,0,TimeUnit.MILLISECONDS,newSynchronousQueue<>(),r->ne…

大家好,又见面了,我是你们的朋友全栈君。

使用方法:

1.SynchronousQueue

private static ExecutorService cachedThreadPool = new ThreadPoolExecutor(4, Runtime.getRuntime().availableProcessors() * 2, 0, TimeUnit.MILLISECONDS, new SynchronousQueue<>(), r -> new Thread(r, "ThreadTest"));

SynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者,必须等队列中的添加元素被消费后才能继续添加新的元素。

拥有公平(FIFO)和非公平(LIFO)策略,非公平侧罗会导致一些数据永远无法被消费的情况?

使用SynchronousQueue阻塞队列一般要求maximumPoolSizes为无界(Integer.MAX_VALUE),避免线程拒绝执行操作。

2.LinkedBlockingQueue

private static ExecutorService cachedThreadPool = new ThreadPoolExecutor(4, Runtime.getRuntime().availableProcessors() * 2, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), r -> new Thread(r, "ThreadTest"));

LinkedBlockingQueue是一个无界缓存等待队列。当前执行的线程数量达到corePoolSize的数量时,剩余的元素会在阻塞队列里等待,当队列满时,才会开启新的线程,立即执行新添加的任务,当线程数达到 maximumPoolSize 数量时,执行线程拒绝策略。每个线程完全独立于其他线程。生产者和消费者使用独立的锁来控制数据的同步,即在高并发的情况下可以并行操作队列中的数据。

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

private static ExecutorService cachedThreadPool = new ThreadPoolExecutor(4, Runtime.getRuntime().availableProcessors() * 2, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(Integer.MAX_VALUE), r -> new Thread(r, "ThreadTest"));

3.ArrayBlockingQueue

 private static ExecutorService cachedThreadPool = new ThreadPoolExecutor(4, Runtime.getRuntime().availableProcessors() * 2, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(32), r -> new Thread(r, "ThreadTest"));

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152120.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Qt Quick实现的涂鸦程序

    Qt Quick实现的涂鸦程序

  • C语言 数组初始化的三种常用方法({0}, memset, for循环赋值)以及原理「建议收藏」

    C语言 数组初始化的三种常用方法({0}, memset, for循环赋值)以及原理「建议收藏」C语言中,数组初始化的方式主要有三种:1、声明时,使用{0}初始化;2、使用memset;3、用for循环赋值。那么,这三种方法的原理以及效率如何呢?请看下面的测试代码:[cpp]viewplaincopy#defineARRAY_SIZE_MAX(1*1024*1024)voidfunction1(){chararray[ARRAY_SIZE_…

  • python表白代码-python告白代码,只属于程序员的浪漫

    python表白代码-python告白代码,只属于程序员的浪漫不知何时,不知何因,程序员这个行业成为大家茶余饭后取乐的无辜群体。只要说到程序员,脑海中就浮现出刻板印象,标配穿搭:格子衫,牛仔裤,黑框眼镜。当然秃顶也是必须的,更狠的吐槽还有邋里邋遢,不懂浪漫,不知人情世故!开始可能只是幽默玩笑,后面慢慢就越传越多,大家便信以为真!可是程序员真的是这样吗?随着现在编程这个行业的普遍高薪收入,程序员又成为大家关注的焦点,深入的了解后,发现程序员其实是很可爱的一个群…

  • 拦截器与过滤器的区别

    拦截器与过滤器的区别文章目录一、二者理解过滤器(Filter)拦截器(Interceptor)二、拦截器与过滤器的区别区别:三、拦截器与过滤器的触发时机拦截器与过滤器触发时机不一样四、使用场景五、图解一、二者理解过滤器(Filter)过滤器,是在javaweb中将你传入的request、response提前过滤掉一些信息,或者提前设置一些参数。然后再传入Servlet或Struts2的action进行业务逻…

  • 2018目标

    2018目标

  • Linux 配置Java环境(图文详细)

    Linux 配置Java环境(图文详细)Linux配置Java环境1、查看系统是否有java环境2、卸载系统自带的jdk1.找到具体的jdk2.然后分别一个一个删除3.验证是否删除成功3、创建一个文件夹用于存放java的压缩包4、包下载好的jdk拖到java文件夹5、安装jdk6、配置环境变量7、让配置生效8、验证是否配置成功1、查看系统是否有java环境输入指令java-version回车即可如图表示Linux系统有自带的jdk,但是这并不是我们想要的,所以得卸载2、卸载系统自带的jdk1.找到具体的jdkrpm-qa

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号