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

news2024/11/17 21:55:55

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

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

相关文章

车载测试系列:车载以太网测试(一)

汽车行业对可靠性和安全性要求越来越高,车载以太网在应用过程中,为了保证其可靠性与安全性,需要对其开展测试工作。 传统的以太网测试和车载以太网测试存在一定差异,传统以太网测试方法并不适用汽车以太网测试。 汽车行业对测试…

C++ 直接初始化 和 拷贝初始化 的区别

参考链接:https://www.jb51.net/article/54773.htm这篇文章主要介绍了C直接初始化与复制初始化的区别深入解析,是很多C初学者需要深入了解的重要概念,需要的朋友可以参考下https://www.jb51.net/article/54773.htm

Web3空投入门:如何增加空投成功的几率

今天分享空投如何避免限制以提高效率,增加成功几率,首先我们来了解什么是空投加密,有哪些空投类型。 一、什么是空投加密? 加密货币空投是一种营销策略,包括向用户的钱包地址发送免费的硬币或代币。 加密货币项目使用…

UE5 audio capture 回声问题 ||在安卓上有爆鸣声

参考视频 0.基本步骤 【UE4_蓝图】录制麦克风声音/系统声音并输出保存WAV文件_ue4录音-CSDN博客 1.步骤 1.创建Sound Submix A 2. 右键新建Sound Submix B 3.把B的两个参数调为-96 4.audio capture的Base Submix,把前面提到的A赋值进去 5.开始录制输出和完成录制…

云动态摘要 2024-05-09

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

Android虚拟机机制

目录 一、Android 虚拟机 dalvik/art(6版本后)二、Android dex、odex、oat、vdex、art区别 一、Android 虚拟机 dalvik/art(6版本后) 每个应用都在其自己的进程中运行,都有自己的虚拟机实例。ART通过执行DEX文件可在设…

C语言leetcode刷题笔记1

C语言leetcode刷题笔记1 第1题:136.只出现一次的数字两次遍历(O(numsSize^2))位运算 第2题:202.快乐数快慢指针记录历史数据 第3题:53.最大子数组和暴力求解(超时)动态规划分治 第1题&#xff1…

C++语言·string类

1. 为什么有string类 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数(strcpy,strcat),但是这些库函数与字符串是分离开的,不太符合OOP(Object Oriented Programming面向对…

[力扣]——125.验证回文串

class Solution {public static boolean isValidChar(char ch){if((ch > a && ch < z) ||(ch > 0 && ch < 9)){return true;}return false;}public boolean isPalindrome(String s) {// 将大小写统一起来s s.toLowerCase();int left 0, right s…

248 基于matlab的GA-RBF神经网络预测

基于matlab的GA-RBF神经网络预测&#xff0c;遗传算法优化来训练RBF网络权值&#xff0c;RBF优化后的结果用于预测。输出真实值、RBF预测结果、GA-RBF预测结果&#xff0c;并进行对比。程序已调通&#xff0c;可直接运行。 248 RBF神经网络 GA-RBF 时间序列预测 - 小红书 (xiao…

信息收集篇 V1.1

零、 前言 0.1 话说 0.2 更新 0.3 致谢 一、 whois 1.1 常用在线收集whois信息站点&#xff1a; 1.2 查询企业的备案信息&#xff0c;主要的三种方式&#xff1a; 1.3 网站真实IP 1.4 旁站C端 二、 子域名 2.1 谷歌语法 2.2 第三方网站聚合了大量的DNS数据&#xff0c;…

2024.5.9

闹钟 widget.h头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime> #include <QTimer> #include <QTimerEvent> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclas…

springboot项目中前端页面无法加载怎么办

在springboot前后端分离的项目中&#xff0c;经常会出现前端页面无法加载的情况&#xff08;比如&#xff1a;前端页面为空白页&#xff0c;或者出现404&#xff09;&#xff0c;该怎么办&#xff1f;&#xff1f;&#xff1f; 一个简单有效的方法&#xff1a;&#xff1a; 第…

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

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

模电·典型的静态工作点稳定电路

典型的静态工作点稳定电路 电路组成和Q点稳定原理二、静态工作点估算三、态参数的估算 电路组成和Q点稳定原理 典型的Q点稳定电路如下图1所示&#xff0c;图&#xff08;a&#xff09;为直接耦合方式&#xff0c;图&#xff08;b&#xff09;为阻容耦合方式&#xff0c;它们具有…

【Ubuntu18.04+melodic】抓取环境设置

UR5_gripper_camera_gazebo&#xff08;无moveit&#xff09; 视频讲解 B站-我要一米八了-抓取不止&#xff01;Ubuntu 18.04下UR5机械臂搭建Gazebo环境&#xff5c;开源分享 运行步骤 1.创建工作空间 catkin_make2.激活环境变量 source devel/setup.bash3.1 rviz下查看模…

SmartEDA电路仿真软件风靡教育圈:揭秘其背后的魅力所在

在当今的电子信息时代&#xff0c;随着科技的飞速发展&#xff0c;电路设计与仿真软件在教育领域的应用越来越广泛。特别是SmartEDA这款电路仿真软件&#xff0c;以其强大的功能和直观易用的操作界面&#xff0c;赢得了众多教师的青睐。那么&#xff0c;究竟是什么原因让SmartE…

短信公司_供应群发短信公司

短信公司——供应群发短信公司 短信公司作为一种为企业提供群发短信服务的服务商&#xff0c;正逐渐受到市场的青睐。供应群发短信公司作为其中的一种类型&#xff0c;为各行各业的企业提供高效、便捷的短信推广渠道。本文将介绍短信公司的作用以及供应群发短信公司的特点和优势…

实习报告怎么写?笔灵AI实习体验报告模版分享:AI产品前端实习生

实习报告怎么写&#xff1f;笔灵AI实习体验报告模版可以帮你 点击即可使用&#xff1a;https://ibiling.cn/scene/inex?fromcsdnsx 下面分享AI产品前端实习生的实习报告 尊敬的导师和领导们&#xff1a;首先&#xff0c;我想对你们表达我的诚挚感谢&#xff0c;感谢你们给我…

认识卷积神经网络

我们现在开始了解卷积神经网络&#xff0c;卷积神经网络是深度学习在计算机视觉领域的突破性成果&#xff0c;在计算机视觉领域&#xff0c;往往我们输入的图像都很大&#xff0c;使用全连接网络的话&#xff0c;计算的代价较高&#xff0c;图像也很难保留原有的特征&#xff0…