关于线程池,它的扩展问题你知道吗?(自己总结)

专门想一下为什么线程池不用Excutors,之前的印象是错的,居然还拿来面试里讲,惭愧,这里暂时整理俩小问题,其他的后续可能会更新。。

线程池是创建的越大越好嘛

#线程池创建的越大越好吗

Tip:2024-04-10 更新

不是。
刚开始想着,线程池创建的大,请求来到不是刚好能分配线程执行这个请求嘛,不是挺好,为什么会导致效率更低呢?

其实不是,如果线程池创建太大,也就是说可用的线程很多,但是 CPU 的核数有限啊,线程执行需要调用 CPU ,所以多线程之间需要争夺 CPU 的执行权,这个过程中可能会发生频繁的上下文切换,导致效率更低

并且呢,线程创建的多,也会消耗更多的内存空间给线程。所以可以根据上面的公式,设置好合理的线程参数,来最大程度的利用线程池。

那问题来啦,线程池创建的太小呢?

  1. 线程池创建太小,可能会导致任务来到的速度大于处理的速度,最终都堆积在任务队列中。假如使用的是无界的任务队列(比如 java 内置的 Executor 类的线程池),那就会导致 OOM 问题。
  2. 像 ThreadPoolExecutor 的线程池,它的任务队列是有限大小的,而且有相应的拒绝策略可以配置,更好的管理,防止 OOM 等问题。

如果是你,你会选用 Excutors 还是 ThreadPoolExecutor ,为什么?

这个面试会问到。

怎么选用得看它们的特性是什么,比如下面这点:

  1. 线程池的用途不同

Excutors 类内部提供了很多静态方法,可以直接快速定义一些种类的简单线程池,比如 FixedThreadPool、cachedThreadPool 等的快捷创建方法。
如图:
在这里插入图片描述

再具体看其中一个方法:
在这里插入图片描述

可以看到这些静态方法,只是把 ThreadPoolExecutor 的参数改成了默认值,所以其底层也是用到了 ThreadPoolExecutor ,它们之间并不是完全不同的两个东西

所以 Excutors 并不是之前想的,什么无界队列导致 OOM 溢出问题才不能用,而是因为这种方式生成的线程池不够"个性化",也就是不能满足一些复杂的需求

  • 至于 OOM 问题,那是因为一些线程池的特性,比如 SingleThreadPool 单线程池,它的任务队列真是无界的,所以真会溢出
  • 还有 CachedThreadPool ,它是基于内存的,所以不管你请求来多少,只要没有空闲线程它就会新创建线程来处理新请求,虽然这种场景确实存在,但是你的服务器不一定能撑得住啊

最后,ThreadPoolExecutor 为什么优先用知道了吧,参数你自己定,更加的可控,自己指定线程创建工厂和任务队列,以及核心线程、最大线程等。

至于线程池参数怎么定那就是其他内容了,之前有整理过,不多说,解耦一下。


补充线程池参数配置:

合理设置线程池参数

我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。在实际工作中,我们需要根据任务类型的不同选择对应的策略。

主要对于两种批量任务有不同的设置方法,最后会有一个公式:

  1. CPU 密集型任务

也就是大量需要进行计算、加密、解密等耗费 CPU 资源的任务。如果线程池的线程数量太多,会导致这些任务争夺 CPU 执行权,频繁的进行上下文切换,这个效率会降低。

所以一般设置线程数为 CPU 核数的 1 到 2 倍,我的项目里设置的是当前可用 CPU 核数的 1.5 倍。(最大线程数是 2 倍)

  1. IO 密集型任务

也就是需要进行文件读写,数据库读写等任务,不会耗费太多 CPU 资源,但是 CPU 会太闲,你闲下来不就是浪费资源了吗,反正机器不用休息(doge)

这种你就可以多开一些线程,在执行 IO 任务的时候,CPU 不用等待 IO 任务结束,而是先去执行一些需要 CPU 的操作,所以要多开线程,去调用 CPU,尽可能的提高 CPU 利用率

  1. 通用计算公式

java 并发编程里有这个公式:线程数 = CPU 核心数 *(1+平均等待时间/平均工作时间)

其实也对应两种类型的任务,比如平均等待时间长,就是 IO 密集型任务,要多开线程提高 CPU 利用率。相反,工作时间长就是 CPU 密集型,需要适量设置线程数。

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

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

相关文章

本地搭建hydra服务用go以验证oidc流程

目录 1、docker搭建hydra,环境配置: 2、搭建完成后服务调用: 2.1保证服务正常启动: 2.2 通过postman调用,获取client_id: 2.3 通过client_id,实现oauth2/auth调用 3. 通过go语言实现oidc验…

【qt】容器的用法

容器目录 一.QVertor1.应用场景2.增加数据3.删除数据4.修改数据5.查询数据6.是否包含7.数据个数8.交换数据9.移动数据10.嵌套使用 二.QList1.应用场景2.QStringList 三.QLinkedList1.应用场景2.特殊点3.用迭代器来变量 四.QStack1.应用场景2.基本用法 五.QQueue1.应用场景2.基本…

OS复习笔记ch5-3

引言 上一节我们学习了关于信号量机制的一些内容,包括信号量的含义,对应的PV操作等。 如图所示,上一节主要是针对信号量的互斥,其实信号量机制还可以做很多事情,比如实现进程同步和前驱关系,这一节我们先复…

【Spring】JdbcTemplate

JdbcTemplate 是 Spring 提供的一个 JDBC 模板类,是对 JDBC 的封装,简化 JDBC 代码 也可以让 Spring 集成其它的 ORM 框架,例如:MyBatis、Hibernate 等 使用 JdbcTemplate 完成增删改查 一、环境准备 数据库: 准备…

Marin说PCB之如何快速打印输出整板的丝印位号图?

当小编我辛辛苦苦加班加点的把手上的板子做到投板评审状态的时候,坐在我旁边的日本同事龟田小郎君说让我把板子上的丝印也要调一下,我当时就急了,这么大的板子,将近1W多PIN 了都,光调丝印都要老半天啊,而且…

Docx文件误删除如何恢复?别再花冤枉钱了,4个高效恢复软件!

不管是工作还是学习,总是会与各种各样的文件打交道。文件量越多就越容易出现文件丢失、文件误删的情况。遇到这些情况,失去的文件还能找回来吗?只要掌握了一些数据恢复方法,是很有机会恢复回来的,下面我会将这些方法分…

[机器学习系列]深入探索回归决策树:从参数选择到模型可视化

目录 一、回归决策树的参数 二、准备数据 三、构建回归决策树 (一)拟合模型 (二)预测数据 (三)查看特征重要性 (四)查看模型拟合效果 (五) 可视化回归决策树真实值和预测值 (六)可视化决策树并保存 部分结果如下: 一、回归决策树的参数 DecisionTreeRegress…

NVIDIA_SMI has failed because it couldn’t communicate with the NVIDIA driver

参考:https://www.zhihu.com/question/474222642/answer/3127013936 https://blog.csdn.net/ZhouDevin/article/details/128265656 nvidia-smi查看报错,nvcc正常 1)查看nvidia版本 ls /usr/src | grep nvidia nvidia-550.78 2)…

暗区突围国际服pc端怎么获取测试资格 twitch掉落资格获取教程

《暗区突围》是由腾讯魔方工作室群开发的第一人称射击类手游。游戏以从暗区撤离并收集物资满载而归作为最终目的,带出的战利品可以存储在仓库中,又可以出售用以换取游戏金钱。游戏中玩家可以创建男性或女性角色,可以通过选择脸型、发型、发色…

C++ 动态内存管理

例如:动态内存和释放单个数据的存储区 一 用new运算符初始化单个数据的存储区 举例

【智能算法】人工原生动物优化算法(APO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.获取代码 1.背景 2024年,X Wang受到自然界原生动物启发,提出了人工原生动物优化算法( Artificial Protozoa Optimizer, APO)。 2.算法原理 2.1算法思想 AP…

压缩归档库-Snappy介绍

1.简介 Snappy 是一个 C 编写的压缩和解压缩库,由 Google 开发。它专为速度而设计,而不是最大压缩率或与其他压缩库的兼容性。 Snappy 通常用于需要快速压缩和解压缩的场景。 Snappy具有以下属性: 快速:压缩速度达到250 MB/秒及…

数智化快速开发平台

助力企业IT规划标准化,实现企业IT生态化 目前市场上有很多面向企业各种业务场景的产品,这些产品给企业管理带来便利性的同时,也带来了一系列问题,例如: 不同系统的后台管理功能基本一致,却需要重复建设&a…

linux调试

文章目录 1. 使用打印来调试1.1 重定向1.2 标准预定义宏1.3 日志代码 2. 内核异常2.1 内核打印2.1.1 打印级别2.1.2 跟踪异常2.1.3 动态打印2.1.4 RAM console 2.2 OOPS2.2.1 有源代码的情况2.2.2 没有源代码的情况 3 查看日志4 工具调试 1. 使用打印来调试 1.1 重定向 2>…

[Collection与数据结构] Map与Set(一):二叉搜索树与Map,Set的使用

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

python socket通讯 学习记录

python socket 1. 初级实现2. 添加header3. 中级实现(引用pickle库)4. 高级实现(相互发送信息)5. 一点尝试5. 1个server对应2个client5.2个server对应1个client 名称版本python3.11 本文涉及到socket的server与client通讯从简单到…

LeetCode 257. 二叉树的所有路径

LeetCode 257. 二叉树的所有路径 1、题目 题目链接:257. 二叉树的所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root…

java.net.SocketInputStream.socketRead0 卡死导致 tomcat 线程池打满的问题

0 TL;DR; 问题与原因:某些特定条件下 java.net.SocketInputStream.socketRead0 方法会卡死,导致运行线程一直被占用导致泄露采用的方案:使用监控线程异步监控卡死事件,如果发生直接关闭网络连接释放链接以及对应的线程 1. 问题 …

nacos下载安装和nacos启动报错

nacos简介: Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您…

YOLOv9中模块总结补充|RepNCSPELAN4详图

专栏地址:目前售价售价69.9,改进点70 专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,助力高效涨点!!! 1. RepNCSPELAN4详图 RepNCSPELAN4是YOLOv9中的特征提取-融合模块,类似前几…