关于线程池其他一些知识点的讨论

news2024/11/13 15:15:47

文章目录

  • 前言
  • 一、线程池的几种任务队列
    • 1.ArrayBlockingQueue
    • 2.LinkedBlockingQueue
    • 3.DelayedWorkQueue
    • 4.SynchronousQueue
  • 二、如何确定核心线程数?
  • 三、线程池的种类有哪些?
    • 1.newFixedThreadPool
    • 2.newSingleThreadExecutor
    • 3.newCacheThreadPool
    • 4.newScheduledThreadPool
  • 四、为什么不建议使用Executor创建线程池?
  • 总结


前言

这篇博客记录一下关于线程池的几种任务队列,一般常用的任务队列是哪种,以及怎么确定线程池的线程数,还有几种常用的线程池创建方式。


一、线程池的几种任务队列

常用的就是ArrayBlockingQueue和LinkedBlockingQueue

1.ArrayBlockingQueue

  • ArrayBlockingQueue是一种有界的数组型任务队列,基于FIFO(先进先出的任务队列)

在这里插入图片描述
如图看ArrayBlockingQueue的构造函数,参数中有一个容量的参数是必传的,因此它是一个有界的任务队列。

2.LinkedBlockingQueue

  • LinkedBlockingQueue是一个无解的底层是一个单链表的任务队列,也是基于FIFO(先进先出的任务队列)

在这里插入图片描述
它默认是无界的,是Integer的最大值。

3.DelayedWorkQueue

  • 是一个优先级队列,它可以保证每次出队的任务都是当前队列中执行时间最靠前的

4.SynchronousQueue

  • 不存储元素的阻塞队列,每个插入操作都必须等待下一个移出操作

二、如何确定核心线程数?

  • 1.高并发、任务执行时间短,采用(CPU核数+1)原则确定核心线程数,减少线程上下文的切换
  • 2.如果是并发不高、任务执行时间长,若是IO密集型任务(CPU核数*2 + 1);若是计算密集型任务(CPU核数+1)
  • 3.并发高、且业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构设计,看看这些业务里面某些数据是否能做缓存是第一步,增加服务器是第二步,至于线程池的设置,参考以上原则进行设置

三、线程池的种类有哪些?

1.newFixedThreadPool

  • 创建一个定长的线程池,可控制最大并发数,超出的线程会在队列中等待

在这里插入图片描述
在这里插入图片描述
看源码可以知道,传入的线程数就是最大线程数和核心线程数,救急线程的活跃时间是0毫秒,使用的任务队列是LinkedBlockingQueue,而且并没有传入任务队列的容量,意味着容量是Integer.MAX_VALUE,这是一个风险

2.newSingleThreadExecutor

  • 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO)执行

在这里插入图片描述
在这里插入图片描述
newSingleThreadExecutor的核心线程数和最大线程数都是1,救急线程的存活时间为0毫秒,任务队列是LinkedBlockingQueue

3.newCacheThreadPool

  • 创建一个可缓存的线程池,如果线程池长度超过,处理需要,可灵活回收空闲线程,若无可回收,则新建线程

在这里插入图片描述
在这里插入图片描述
newCacheThreadPool核心线程数为0,最大线程数为Integer.MAX_VALUE,救急线程存储时间为60S,任务队列是SynchronousQueue,不存储任务的队列

4.newScheduledThreadPool

  • 可以执行延迟任务的线程池,支持定时及周期性任务执行

在这里插入图片描述
newScheduledThreadPool核心线程数需要定义,最大线程数是Integer.MAX_VALUE,救急线程存活时间是0ms,任务队列是DelayedWorkQueue

四、为什么不建议使用Executor创建线程池?

  • 1.线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的人更加明确线程池的运行规则,避免资源耗尽的风险
  • 2.FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM(内存溢出)
  • 3.CachedThreadPool:允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM

总结

线程池有关知识点先告一段落,下面我会继续总结并发编程中的安全相关问题,比如Synchronized锁,乐观锁,悲观锁,以及死锁等问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/736342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI掌绘艺术:揭秘Stable Diffusion华美图韵背后那些提示词的秘密

开篇 好了好了,我知道这个标题有点大,大得像我妈的锅一样。但是,我保证,当你读完这篇文章后,你不仅会明白我为什么敢用这样的标题,而且你也会想试试宝贵的AI画画方法。 首先,我要说&#xff0…

【ARM Coresight 系列文章 3.1 - ARM Coresight DP 对 AP 的访问 1】

文章目录 1.1 DP 中相关寄存器的介绍1.1.1 DPACC and APACC 寄存器1.1.2 DP SELECT 寄存器1.1.3 AP CSW寄存器1.1.4 AP TAR 寄存器1.1.5 AP DRW寄存器1.1.6 AP Banked Data registers 1.1 DP 中相关寄存器的介绍 如果DAP接入的是JTAG接口,那么将会通过APACC寄存器来…

idea中非常好用的配置

1、自动导包和优化多余的包 2、显示行号、方法之间的分隔符 3、忽略大小写进行提示 4、多个类不隐藏,多行显示 5、鼠标悬浮代码提示 6、加入类之前的稳定注释模板 好了,文章就分享到这里了,看完之后如果对你有所帮助,不要忘了点赞…

【机器学习核心总结】什么是长短时记忆网络(LSTM)

什么是长短时记忆网络(LSTM) RNN有一定的记忆能力,但不幸的是它只能保留短期记忆,在各类任务上表现并不好,那该怎么办? 人们将目光投向了自己,人类的记忆是有取舍的,我们不会记住每时每刻发生的所有事,会…

学无止境·MySQL④(多表查询)

多表查询试题 试题一1、创建表2、表中添加数据3、查询每个部门的所属员工4、查询研发部门的所属员工5、查询研发部和销售部的所属员工6、查询每个部门的员工数,并升序排序7、查询人数大于等于3的部门,并按照人数降序排序 试题一 1、创建表 use mydb3; – 创建部门…

技术文本的写作问题

最近刚参与一位大佬的重要文本撰写,也就3000字,磨了有几个月。 收获很多。关于技术写作,要写透,要写简单;要舍得放弃。 写透看起来简单,其实是最难的。一般人看到有字数限制就拼命压缩文本,把…

从零开始制作一个Web蜜罐扫描器(1)

从零开始制作一个Web蜜罐扫描器(0)_luozhonghua2000的博客-CSDN博客 蜜罐有什么特征 根据我们上面的描述,现在可以理解,蜜罐的功能是诱捕黑客. 诱捕黑客是利用的jsonp劫持技术来做。 jsonp劫持技术需要利用jsonp跨域请求很多其他的社交网站页面从而获得攻击者的相关信息。 因…

SpringBoot第20讲:SpringBoot如何对接口进行签名

SpringBoot第20讲:SpringBoot如何对接口进行签名 在以SpringBoot开发后台API接口时,会存在哪些接口不安全的因素呢?通常如何去解决的呢?本文是SpringBoot第20讲,主要介绍API接口有不安全的因素以及常见的保证接口安全的…

青岛大学_王卓老师【数据结构与算法】Week04_12_案例分析与实现2_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–…

Python+OpenCV人行道盲道边缘侦测识别

程序示例精选 PythonOpenCV人行道盲道边缘侦测识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonOpenCV人行道盲道边缘侦测识别>>编写代码&#xff0c;代码整洁&#x…

使用 Jest 在 Visual Studio Code 中进行更好的单元测试

目录 前言&#xff1a; 使用 Jest 扩展显著改善测试流程 1.自动启动 Jest 测试 2. 显示单个失败/通过的测试用例 允许调试单元测试 在文件中显示代码覆盖率 结论 前言&#xff1a; Jest是一个流行的JavaScript测试框架&#xff0c;它提供了简洁、灵活和强大的工具来编写…

ChatGPT炒股:查询分析某个公募基金的持仓变化

如果很认同某个基金经理的投资理念&#xff0c;可以跟踪基金经理的持仓变化&#xff0c;可以获取一些投资的线索。手动操作也可以实现&#xff0c;但略微麻烦&#xff0c;如果利用ChatGPT写一个跟踪程序&#xff0c;就方便多了。 下面以汇丰晋信副总经理、投资总监、知名基金经…

深入理解java虚拟机精华总结:线程安全与锁优化

深入理解java虚拟机精华总结&#xff1a;线程安全与锁优化 线程安全Java语言中的线程安全不可变绝对线程安全相对线程安全线程兼容线程对立 线程安全的实现方法互斥同步非阻塞同步无同步方案 锁优化自旋锁与自适应自旋锁消除锁粗化轻量级锁偏向锁 线程安全 当多个线程同时访问…

MF30:VBA_清除Excel缓存

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

【云原生|Docker系列第1篇】什么?你竟然还不知道Docker?

欢迎来到Docker入门系列的第一篇博客&#xff01;在当今的应用开发和部署领域&#xff0c;Docker已经成为一项极具吸引力的关键技术。本篇博客将为您介绍Docker的基本概念和作用&#xff0c;并解释为什么它成为现代应用开发和部署的终极利器。无论您是开发人员、系统管理员还是…

Java小白的学习之路——day11(静态)

目录 一、java的内存分析 1.java的内存区域 二、静态static 静态属性 静态方法 类加载 什么是类加载&#xff1f; 什么是触发类加载&#xff1f; 一、java的内存分析 1.java的内存区域 java的内存区域有五个区域 i.堆区&#xff1a;存放new的对象、成员遍历、常量池&a…

Yolov5-Lite + Sort算法实现边缘目标跟踪

文章目录 前言项目结构Sort算法实现卡尔曼跟踪器工具类多目标跟踪器 整合 前言 昨天挖了个坑&#xff0c;那么今天的话把坑填上&#xff0c;只要是实现Sort算法和Yolov5-Lite的一个整合。当然先前的话&#xff0c;我们在Yolov3–Tiny的时候&#xff0c;也做了一个&#xff0c;…

Netty实战(一) netty入门之创建echo服务器

目录 一、理论知识1. 网络协议TCP/UDP2. netty简介3. 依赖4. netty核心类介绍 二、开发实战1. 服务端2. 客户端 demo源码参考 一、理论知识 1. 网络协议TCP/UDP TCP、UDP协议属于七层协议中传输层的协议&#xff0c;这两种主流协议的差异&#xff1a; TCP是一个面向连接的、…

ArcGIS Pro遥感影像分类:随机森林、支持向量机方法

本文介绍在ArcGIS Pro软件中&#xff0c;基于随机森林、支持向量机等多种算法&#xff0c;对遥感影像数据加以监督分类的具体方法。 在文章ArcGIS中ArcMap栅格遥感影像的监督分类&#xff08;https://blog.csdn.net/zhebushibiaoshifu/article/details/126905442&#xff09;中…

【已解决】Couldn‘t find a tree builder with the features you requested: lxml

这是一个常见于Python爬虫代码的报错。 报错代码&#xff1a; soup BeautifulSoup(r.text, xml) 报错原因&#xff1a; BeautifulSoup的解析方法之一&#xff0c;xml&#xff0c;需要安装好lxml库才行 解决办法&#xff1a; 安装 lxml 库即可。 pip install lxml 安装好…