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

专门想一下为什么线程池不用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.rhkb.cn/news/322999.html

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

相关文章

阵痛中的乳业产业,何时才能成为下一个啤酒产业?

说起饮品,近年来中国啤酒业中各大品牌齐齐聚焦高端化的趋势绝对值得一提。然而,与之相反,国内乳业却是仍未进入高端化阶段,甚至陷入了周期底部中。 图源:中国圣牧财报 增收降利 牧企承受巨大的供需缺口压力 从产业链…

字节跳动(社招)四面算法原题

TikTok 进展 又是一期定时汇报 TikTok 进展的推文。 上周,美国总统拜登签署了价值 950 亿美元的一揽子对外援助法案。 该法案涉及强制字节跳动剥离旗下应用 TikTok 美国业务,即 针对 TikTok 非卖即禁的"强抢行为"开始进入九个月(27…

五大自动化测试的 Python 框架

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

学习经验分享【36】论文投稿写作(非理工科文章)

业务进一步扩展,可辅导非理工科偏文科性质的论文辅导,有需要评职称但没有时间精力研究的或者其他相关需求的朋友可咨询了解。 人工智能技术在各领域的发展和思考,类似这种主题的文章。

Adobe系列软件安装

双击解压 先运行Creative_Cloud_Set_Up.exe。 完毕后,运行AdobeGenP.exe 先Path,选路径,如 C:\Program Files\Adobe 后Search 最后Patch。 关闭软件,修图!

17 内核开发-内核内部内联汇编学习

​ 17 内核开发-内核内部内联汇编学习 课程简介: Linux内核开发入门是一门旨在帮助学习者从最基本的知识开始学习Linux内核开发的入门课程。该课程旨在为对Linux内核开发感兴趣的初学者提供一个扎实的基础,让他们能够理解和参与到Linux内核的开发过程中…

Jenkins--自动化构建和部署SpringBoot项目

一、实现目标 通过在Jenkins中创建流水线任务,编写流水线脚本以实现自动化构建和部署SpringBoot项目。流水线脚本主要实现以下几个步骤: Preparation:从gitee上拉取远程仓库的SpringBoot项目代码。Build:使用Maven对拉取的代码进…

浅析扩散模型与图像生成【应用篇】(二十二)——DreamBooth

21. DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 本文提出一种根据少量样例图片来对文生图模型进行微调的方法,从而可以生成包含样例物体,但风格、姿态、背景都可以任意修改的图片。现有的文生图模型都是需要…

CCF-Csp算法能力认证, 202303-1重复局面(C++)含解析

前言 推荐书目,在这里推荐那一本《算法笔记》(胡明),需要PDF的话,链接如下 「链接:https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码:6vdq”复制这段内容后打开手机迅雷…

QT:核心控件-QWidget

文章目录 控件enableobjectNamegeometrysetWindowTitleopacitycursorFonttooltipstyleSheet 控件 什么是控件? 如上所示,就是控件,而本篇要做的就是对于这些控件挑选一些比较有用的常用的进行讲解分析 在QT的右侧,会有对应的空间…

asp.net朱勇项目个人博客(3)

引文:按照书上的项目,我们最后实现管理端的三个增删改查的功能即可,相对与三个增删改查,文章,分类和留言,这里我们所需要用的的关联的一个表就是文章表,因为文章表每一个文章的增加显示和修改都需要对应的一个分类&…

【C++11新特性】lambda表达式和应用场景

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

汽车电子零部件(13):BMS电池管理系统

前言: 电池管理系统(BMS)确保电动汽车(EV)的能量分配安全高效。目前流行电动汽车中使用的有四种主要BMS架构,BMS与充电基础设施互为集成关系。BMS主要管理 的是电池组,电池组由很多电芯组成,比如下图是H/EV电池组的主要部件,显示了电池、连接、控制电路和包装的总体布…

毕业设计:《基于 Prometheus 和 ELK 的基础平台监控系统设计与实现》

前言 《基于 Prometheus 和 ELK 的基础平台监控系统设计与实现》&#xff0c;这是我在本科阶段的毕业设计&#xff0c;通过引入 Prometheus 和 ELK 架构实现企业对指标与日志的全方位监控。并且基于云原生&#xff0c;使用容器化持续集成部署的开发方式&#xff0c;通过 Sprin…

如何通过wifi网络将串口数据发送到多个设备

摘要&#xff1a;当lora电台的速率无法满足高速传输时&#xff0c;可以考虑用“串口服务器”。本文介绍一下如何使用TP-LINK的TL-CPE300D实现一对多的数据发送。 当前也有使用lora电台的&#xff0c;但是lora电台支持的速率有限&#xff0c;可能最大支持到9600&#xff0c;甚至…

【VTKExamples::Rendering】第一期 TestAmbientSpheres(环境照明系数)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TestAmbientShperes,介绍环境照明系数对Actor颜色的影响,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动…

部署 Sentinel 控制台:实现流量管理和监控

序言 Sentinel 是阿里巴巴开源的一款流量防护与监控平台&#xff0c;它可以帮助开发者有效地管理微服务的流量&#xff0c;实现流量控制、熔断降级、系统负载保护等功能。本文将介绍如何在项目中部署和配置 Sentinel 控制台&#xff0c;实现微服务的流量防护和监控。 一、Sen…

《Python机器学习 》书籍分享

文章目录 前言内容介绍作者简介书籍目录 前言 随着计算能力的快速增长&#xff0c;大量任务都可在台式机上完成&#xff1b;在这样的背景下&#xff0c;机器学习应运而生&#xff0c;成为当今炙手可热的话题。但初出茅庐的新手常对机器学习感到十分畏惧&#xff1b;为给这些新…

RabbitMQ 是如何做延迟消息的 ?——Java全栈知识(15)

RabbitMQ 是如何做延迟消息的 &#xff1f; 1、什么是死信&#xff1f; 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xff08;dead letter&#xff09;&#xff1a; 消费者使用 basic.reject 或 basic.nack 声明消费失败&#xff0c;并且消息的 reque…

推荐5个免费的国内平替版GPT

提起AI&#xff0c;大家第一个想到的就是GPT。 虽然它确实很厉害&#xff0c;但奈何于我们水土不服&#xff0c;使用门槛有些高。 不过随着GPT的爆火&#xff0c;现在AI智能工具已经遍布到各行各业了&#xff0c;随着时间的推移&#xff0c;国内的AI工具也已经“百花盛放”了…