线程池的三种队列区别: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)


相关推荐

  • 网络入门及制作双绞线实验结论_计算机网络双绞线包括哪几种类型

    网络入门及制作双绞线实验结论_计算机网络双绞线包括哪几种类型专业软件工程姓名小何学长实验目的:1. 掌握RJ-45双绞线的直通线和交叉线的制作方法,了解其应用场合。2. 利用测线仪测试网线是否正常。实验原理:1. 双绞线简介双绞线是最常用的网络传输媒体,其型号10BBASE-T、100BASE-T是指10Mbps、100Mbps以基带传输方式工作的双绞线。按信号线外面有无屏蔽保护层分为:屏蔽双绞线——STP,有金属网丝套作为屏蔽层,无分类;无屏蔽双绞线——UTP,没有屏蔽层,有多个分类,如UTP-3,UTP-5,UTP-5+多…

    2022年10月28日
  • 有刷/无刷动力电调与马达知识

    有刷/无刷动力电调与马达知识模型车需要行驶,就跟真车一样,需要一套动力单元,也有分电动和油动,至于混合动力这个估计就不需要奢望了,对于车模这么小的空间来说是不现实的,而且模型车也不需要考虑燃油经济性的问题。本文则重点介绍电动模型的动力单元。电动模型的动力,主要是指2个元件:第一就是带动车架行驶的电机(Motor),也称马达/摩打等。第二就是控制电机转速的调速器(SpeedController),很久之前早期的调速器…

  • VSCode 前端插件推荐

    VSCode 前端插件推荐开发综合推荐插件名:别名路径跳转使用说明:别名路径跳转插件,支持任何项目,使用场景:当你在开发页面时,想点击别名路径导入的组件时(演示如下)配置说明下载后只需自定义配置一些自己常用的别名路径即可//文件名别名跳转”alias-skip.mappings”:{“~@/”:”/src”,”views”:”/src/views”,”assets”:”/src/assets”,”network”:”/src/network”,”

  • linux常用命令csdn_linux的rename命令

    linux常用命令csdn_linux的rename命令一.基础知识1.1liunx系统的文件结构/dev设备文件/etc大多数配置文件/home普通用户的家目录/lib32位函数库/lib6464位库/media手动临时挂载点/mnt手动临时挂载点/opt第三方软件安装位置/proc进程信息及硬件信息/root临时设备的默认挂载点/sbin系统管理命令/srv

  • adb 安装应用程序「建议收藏」

    adb 安装应用程序「建议收藏」应用程序安装-将一个包推送到设备上并安装它。 adbinstalltest.apk APP安装-将多个APK推送到一个包的设备上并安装它们 adbinstall-multipletest.apktest2.apk 应用程序安装-将一个或多个包推送到设备上,并以原子方式安装它们。 adbinstall-multi-packagetest.apkdemo.apk 替换现有应用程序 重新安装现有的应用…

  • rider 激活码分享【2021.10最新】

    (rider 激活码分享)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~23…

发表回复

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

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