多线程相关(2)

线程池

  • 构造函数
  • 处理过程
  • 拒绝策略
    • JDK 内置的拒绝策略
  • Executors类实现线程池
  • 线程池大小设置

通过复用已创建的线程,降低资源损耗、线程可以直接处理队列中的任务加快响应速度、同时便于统一监控和管理。

构造函数


/*** 线程池构造函数7大参数*/
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,    TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,    RejectedExecutionHandler handler) {}

参数介绍:

参数作用
corePoolSize核心线程池大小
maximumPoolSize最大线程池大小
keepAliveTime线程池中超过 corePoolSize 数目的空闲线程最大存活时间
TimeUnitkeepAliveTime 时间单位
workQueue阻塞任务队列
threadFactory新建线程工厂
RejectedExecutionHandler拒绝策略。当提交任务数超过 maxmumPoolSize+workQueue 之和时,任务会交给RejectedExecutionHandler来处理

处理过程

线程处理任务过程线程处理任务过程

  • 当线程池小于corePoolSize,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
  • 当线程池达到corePoolSize时,新提交任务将被放入 workQueue 中,等待线程池中任务调度执行。
  • 当workQueue已满,且 maximumPoolSize 大于 corePoolSize 时,新提交任务会创建新线程执行任务。
  • 当提交任务数超过 maximumPoolSize 时,新提交任务由 RejectedExecutionHandler 处理。
  • 当线程池中超过corePoolSize 线程,空闲时间达到 keepAliveTime 时,关闭空闲线程 。

拒绝策略

线程池中的线程已经用完了,无法继续为新任务服务,同时,等待队列也已经排满了,再也塞不下新任务了。这时候我们就需要拒绝策略机制合理的处理这个问题。

JDK 内置的拒绝策略

  1. AbortPolicy:直接抛出异常,阻止系统正常运行。可以根据业务逻辑选择重试或者放弃提交等策略。
  2. CallerRunsPolicy :只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。不会造成任务丢失,同时减缓提交任务的速度,给执行任务缓冲时间。
  3. DiscardOldestPolicy :丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。
  4. DiscardPolicy :该策略默默地丢弃无法处理的任务,不予任何处理。如果允许任务丢失,这是最好的一种方案。

Executors类实现线程池

Executors实现线程池

  • newSingleThreadExecutor():只有一个线程的线程池,任务是顺序执行,适用于一个一个任务执行的场景
  • newCachedThreadPool():线程池里有很多线程需要同时执行,60s内复用,适用执行很多短期异步的小程序或者负载较轻的服务
  • newFixedThreadPool():拥有固定线程数的线程池,如果没有任务执行,那么线程会一直等待,适用执行长期的任务。
  • newScheduledThreadPool():用来调度即将执行的任务的线程池
  • newWorkStealingPool():底层采用forkjoin的Deque,采用独立的任务队列可以减少竞争同时加快任务处理
    各方式特点
    各方式都存在缺点
    FixedThreadPool 和 SingleThreadExecutor :允许请求的队列⻓度为 Integer.MAX_VALUE,会导致OOM。
    CachedThreadPool 和 ScheduledThreadPool :允许创建的线程数量为 Integer.MAX_VALUE,会导致OOM。
    手动创建的线程池底层使用的是ArrayBlockingQueue可以防止OOM。

线程池大小设置

  1. CPU 密集型(n+1)
    CPU 密集的意思是该任务需要大量的运算,而没有阻塞,CPU 一直全速运行。
    CPU 密集型任务尽可能的少的线程数量,一般为 CPU 核数 + 1 个线程的线程池。
  2. IO 密集型(2*n)
    由于 IO 密集型任务线程并不是一直在执行任务,可以多分配一点线程数,如 CPU x 2
    也可以使用公式:CPU 核心数 x(1+平均等待时间/平均工作时间)

原文:https://mp.weixin.qq.com/s/IVgGXQKU1QiT1ToN2wXHJg

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

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

相关文章

三角形个数

萌萌已经有2根长度为a和b的棍子&#xff0c;她想再找一根棍子组成一个三角形。在杂物间里&#xff0c;发现了 n 根棍子&#xff0c;长短不一&#xff0c;她想知道有几根棍子是可以取来和原来的2根组成三角形。 输入格式 第一行3个整数a、b和n&#xff0c;a和b的范围在[1,100]&…

前端 Vue启动本地(.exe)文件

首先&#xff0c;启动本地的.exe文件的方式有以下两种: 方式1:通过使用JS打开本地exe文件。但是一般的浏览器&#xff0c;由于安全问题&#xff0c;都会禁止掉这个JS对象&#xff0c;这就导致部分浏览器不支持该种方式。 方式2:利用浏览器外部协议&#xff08;URL Procotol&a…

opencv鼠标操作与响应

//鼠标事件 Point sp(-1, -1); Point ep(-1, -1); Mat temp; static void on_draw(int event, int x, int y, int flags, void *userdata) {Mat image *((Mat*)userdata);if (event EVENT_LBUTTONDOWN) {sp.x x;sp.y y;std::cout << "start point:"<<…

动态住宅IP代理是什么意思,与静态住宅IP代理的区别和比较

动态住宅IP代理是一种不断变化的IP地址解决方案&#xff0c;用于提高在线安全性、绕过地理限制并进行高级数据挖掘。与静态住宅IP代理相比&#xff0c;动态IP提供更高的匿名性和灵活性&#xff0c;但也有其独特的局限性和成本。我们旨在为您提供一个全面的视角&#xff0c;让您…

LocalSend跨设备传输文件传输协议 v2

LocalSend仓库地址&#xff1a;GitHub - localsend/localsend: An open-source cross-platform alternative to AirDrop LocalSend 协议 v2 English | 简体中文 主要为了实现一个不依赖于任何外部服务器的简单 REST 协议。 因为计算机网络比较复杂&#xff0c;因此我们不能假…

开源Excel 处理工具库MyExcel介绍以及简单例子

MyExcel是一个开源的Java库&#xff0c;用于简化Excel文件的处理。它提供了一种简单、高效的方式来读写Excel文件&#xff0c;支持多种格式&#xff0c;包括XLS、XLSX和CSV。MyExcel的设计目标是易于使用&#xff0c;同时提供足够的灵活性来处理复杂的Excel操作。 主要…

【ModelScope】Linux安装

CentOS下g的安装 Centos下的g安装包的名字叫做gcc-c&#xff0c;这是与Centos与Ubuntu不同的地方。安装命令如下&#xff1a; yum install gcc gcc-c pip安装 ModelScope Libarary由核心框架&#xff0c;以及不同领域模型的对接组件组成。如果只需要ModelScope模型和数据集访…

Java实现假日旅社管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统介绍2.2 QA 问答 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿评论4.3 查询民宿新闻4.4 新建民宿预订单4.5 查询我的民宿预订单 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的假日旅社…

uniapp引入微信小程序直播组件

在manifest.json配置即可&#xff0c;与直接在小程序代码中引入相同。 在工程的manifest.json文件中引入直播插件 "mp-weixin" : {/* 小程序特有相关 */"usingComponents" : true,"appid" : "xxx","plugins": {"live…

3.Swift导航栏的使用

Swift 导航栏的使用 一、基本使用 1.1 创建导航栏 在AppDelegate 如下方法中添加创建导航栏的代码&#xff1a; func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { …

js遇到的问题 --持续更新

indexOf 遇到问题&#xff1a; 如果key if(INK,map.indexOf(key) -1)return alert("取芯方式维护有误&#xff01;"); 改表单式仍就不会报错 结果&#xff1a;INK,map.indexOf()0js 格式化时间 YYYY-MM-DD形式 new Date().toISOString().substr(0, 10);

Gin框架: Cookie和Session在单体架构和分布式架构下的应用

Gin 中单一Cookie的应用 1 &#xff09;路由处理 package routersimport ("gin-demo/controllers/web""github.com/gin-gonic/gin" )func WebRoutersInit(r *gin.Engine) {webRouters : r.Group("/"){webRouters.GET("/", web.WebCtr…

第十七届“挑战杯”广东大学生课外学术科技作品比赛感想

博主曾在2023年参加了第十七届“挑战杯”广东大学生课外学术科技作品比赛&#xff0c;也就是人们俗称的大挑&#xff0c;在团队赛里面含金量应该是排在第一档的了&#xff0c;当初我们有幸作为学校唯一一支科技创新B类进入到线下答辩&#xff0c;线下答辩就是区分银奖和金奖和特…

postgis应用笔记

1. postgis多边形查询相交LineString并切割相交范围内 table.shape 是postgis的Geometry的lineString 传入的参数shape是wkt格式的pologon select st_intersection(shape,st_geofromewkt(${shape})) from table where st_intersects(shape,st_geofromewkt(${shape}))2. 路牌坐…

恩智浦MCX A系列:开启工程师的无限创造潜力 | 百能云芯

恩智浦半导体&#xff08;NXP&#xff09;最近宣布推出旗下MCX产品组合中的全新成员——通用A系列的首批产品MCX A14x和MCX A15x&#xff0c;现已正式上市。这一系列的微控制器&#xff08;MCU&#xff09;不仅性价比高、使用便捷、体积小巧&#xff0c;而且还旨在为工程师们打…

分布式版本控制系统 Git

目录 一、Git简介 二、Git历史 三、安装git 1.准备环境 2.Yum安装Git 四、初次运行 Git 前的配置 命令集 实例&#xff1a; 五、Git命令常规操作 六、获取 Git 仓库&#xff08;初始化仓库&#xff09; 创建裸库 实例 &#xff1a; 创建本地库 一、Git简介 官网&…

美国硅谷服务器的优势有哪些

很多用户在选择服务器时会优先选择美国硅谷服务器&#xff0c;那么美国硅谷服务器&#xff0c;为什么会让人更加青睐&#xff0c;美国硅谷服务器为您整理发布美国硅谷服务器的优势有哪些。 美国硅谷服务器的优势主要体现在以下几个方面&#xff1a; 1. 性能卓越&#xff1a;硅…

opencv-python安装失败问题解决

用pip install opencv-python命令终端中出现如下报错&#xff1a; 解决方法&#xff0c;换一个源&#xff0c;输入&#xff1a; pip install opencv-python -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com运行之后即可安装成功&#xff1a;

【工具】Ubuntu开机黑屏、NVIDIA显卡驱动问题

重装显卡驱动导致开机黑屏 联想 P720 工作站&#xff0c;更新NVIDIA Quadro RTX5000 显卡驱动&#xff0c;重启后黑屏。 开机后待显示Lenovo后按下ESC&#xff0c; 进入Ubuntu 设置&#xff0c;按下E键&#xff0c;用箭头移动光标改参数 ro quiet splash $vt_handoff 改为 rw …

CAN Linux C应用编程

由于 Linux 系统将 CAN 设备作为网络设备进行管理&#xff0c;因此在 CAN 总线应用开发方面&#xff0c; Linux 提供了SocketCAN 应用编程接口&#xff0c;使得 CAN 总线通信近似于和以太网的通信&#xff0c;应用程序开发接口更加通用&#xff0c;也更加灵活。 SocketCAN 中大…