线程池介绍及实际案例分享

发布于:2024-10-24 编辑:匿名 来源:网络

1.本文知识脉络以Java为例。线程使用中遇到哪些痛点?引入了池化的思想,那么Java是如何使用线程池来解决此类问题的呢? Java线程池使用中的问题。

公司是如何实践的?本文的亮点在于系统地讲解了Java中线程池是如何引入、实践、演变的过程。无论是在工作中还是在面试中,都可以帮助学生系统地解释线程池问题。

1.1.线程的痛点随着计算机多核CPU的演进,为了充分发挥线程并发性,开发者开始利用多线程来提高系统性能,充分发挥多核CPU带来的便利。每当我们需要执行任务时,我们都需要创建一个新的线程来运行。

我们知道的是,线程的创建和销毁都需要开销,无论是内存使用还是CPU使用。无限创建线程的最终结果是耗尽内存和CPU,导致系统无法接收新的请求,从而系统不可用。

这是我们不愿意看到的灾难。那么我们可以思考一个问题吗?我们是否需要每次都创建一个可以服务请求的线程?这里是否存在资源浪费,如何合理控制系统负荷,保证正常水位? 1.2.汇集思想。

关于池化的定义可以参考百度百科。对于存储来说,池化的概念并不陌生。

可以说,存储池的概念并不是始于存储虚拟化技术。存储从服务器直连存储发展到以SAN或NAS为代表的网络存储的过程中,池化的概念被提出。

我们可以简单地将其理解为一种思想的抽象表达,可以用于物理或虚拟中,以提高某些资源的利用率。比如我们现在说的线程,我们应该如何使用池化的思想呢?从线程的痛点我们知道,我们要解决的主要问题有两个:资源浪费和资源使用不可控。

我们提前创建线程并将它们放入池(队列容器)中。当你需要的时候,我只是在容器池中为你提供一个线程。

当整个请求链路完成后,线程被放回到容器中。这样我只需要维护池中的线程即可,不再需要每次都创建和回收线程。

是否增加了线程的资源复用性,提高了资源利用率?以上确实解决了资源浪费的问题,但是资源使用不可控怎么办?例如,如何设置池中合理的线程数?如果外部流量请求线程远远超过我们系统的负载能力怎么办?这里我们之前提到过,我们的多线程实际上是基于服务器的多核能力。所以我们首先想到的是基于服务器的多核能力。

我们能计算出合理的线程数吗?公式来自《Java 并发编程实践》,但实际上这里存在一些问题。如果你在实践中使用这个公式,你会发现它仍然不符合?那么我们在实践中会遇到哪些问题呢?大家可以继续看公司的实践(基于美团的实践场景)。

在讲之前我们先来了解一下线程池的原理? 1.3.线程池的原理。我们先看一下ThreadPoolExecutor的运行流程原理,如下图: 基于我们之前提到的两个痛点,资源浪费和资源使用不可控。

1.3.1. 【痛点一】资源浪费示例:假设现在我们要下单购买一款产品。我想买衣服(任务提交)。

某宝跳转支付页面(任务分配)->调用支付宝付款(线程分配A)您付款完成(任务分配)->扣除库存(线程分配B)您查看订单物流信息(任务分配)分配)->新秀秀在途(线程分配A)你关闭某个宝藏,等待衣服到达。上面已经简化了该过程。

主要描述的是说红色的【线程分配A】被重用了2次(实际中可能会被使用多次/1次(这里举一个简单的例子以便更好的解释),从而避免了创建线程3的开销正常情况下回收线程3次,如果我们现在有多个用户完成上述步骤,就可以充分发挥线程池的作用,提高复用性1.3.2。从上图我们看到有缓冲执行和任务拒绝,其实这两个代表的是解决我们刚才提到的如果当前用户请求负载超过实时处理能力的痛点。

线程池,那么我们就可以安排它进入缓存阻塞队列,也就是说告诉它我们一次只能容纳最多的人,如果满足人的情况,那我们还等什么呢。如果超过最大容量怎么办?为了保护我们系统的可用性,我们很抱歉拒绝提供服务。

其实这个还是比较容易理解的。例如,当您现在进行限时抢购时,有时您会发现“亲爱的,服务器正忙,请稍后重试!”。

其实就是对当前系统服务处理能力的自我保护。服务被拒绝。

1.3.3.线程池原理讲解。首先,线程池内部其实构建了一个生产者-消费者模型,将线程和任务解耦,不直接相关,从而很好的缓冲任务,复用线程。

线程池的运行主要分为两部分:任务管理和线程管理。任务管理部分扮演了生产者的角色。

当任务提交后,线程池将决定任务的后续流程:(1)直接申请线程执行任务; (2)缓冲在队列中等待线程执行; (3) 拒绝任务。线程管理部分是消费者。

它们统一维护在线程池中,并根据任务请求分配线程。当线程完成任务后,会继续获取新的任务来执行。

最后,当线程无法获取任务时,线程将被回收。 1.4. Java中的实践我们可以看一下Java中提供的线程池创建类及其核心参数。

这里不描述执行器,因为在实践中,自定义线程池越多越好,特别是在核心参数的自定义方面。 1.4.1.参数介绍上面的英文解释很好。

鉴于解释友好,这里进一步解释一下: corePoolSize(核心线程数)queueCapacity(任务队列数)MaxPoolSize(最大线程池数)KeepAliveTime(线程空闲时间)allowCoreThreadTimeout(允许核心线程超时)rejectedExecutionHandler (任务拒绝处理程序) 1.4.2、线程池默认值 ? corePoolSize = 1 ?queueCapacity = Integer.MAX_VALUE ? maxPoolSize = Integer.MAX_VALUE ? keepAliveTime = 60 秒 ?allowCoreThreadTimeout = false ?rejectedExecutionHandler = AbortPolicy() 我们可以初始化并设置基于上面提供的线程池参数的自定义线程池。 1.5.公司的做法 1.5.1。

公司实践中存在的问题 参考美团的两个事故案例:从事故案例中我们可以看到哪些问题?主要问题是我们实践中的线程拒绝策略和核心线程数设置。那么我们应该如何合理的设置线程池参数呢?从解决方案来看,目前我们可以有这三种解决方案,但是上述问题也很明显。

事实上,没有什么灵丹妙药可以解决这个问题,但是我们可以思考一下,是否有一个折衷的方案来根据不同的场景动态开发线程池? 1.5.2.公司提供的解决方案仍然参考了美团的解决方案。针对线程池的痛点,美团提出了动态修改线程池参数+手动可观测+报警机制防范。

1.5.2.1。核心参数如何设置,需要根据以下几个值来确定 -tasks:每秒任务数,假设为~ -taskcost:每个任务花费的时间,假设为0.1s -responsetime:最大系统允许的响应时间,假设做几次计算是1s - corePoolSize = 每秒需要多少个线程?? ? ? ? ? ? ? ? ? ? ? ? * 线程数 = 任务/(1/任务成本) = 任务*taskcout = (~)*0.1 = 50~ 线程。

corePoolSize设置应大于50 * 根据原则,如果每秒80%的任务数小于,则corePoolSize可以设置为80 - queueCapacity = (coreSizePool/taskcost)*responsetime * 计算出的queueCapacity = 80 /0 .1*1 = 80。这意味着队列中的线程可以等待1s。

如果超过限制,则需要开启新的线程执行。 * 切记不要将其设置为Integer.MAX_VALUE。

这样,队列就会非常大,线程数也只会停留在 corePoolSize 大小。当任务急剧增加时,不能再开启新的线程执行,响应时间就会急剧增加。

- maxPoolSize = (max(tasks)-queueCapacity)/(1/taskcost) * 计算所得 maxPoolSize = (80)/10 = 92 * (最大任务数 - 队列容量)/每个线程每秒处理能力 = 最大线程数 - rejectedExecutionHandler:根据具体情况而定。如果任务不重要,可以放弃。

如果任务很重要,应该使用一些缓冲机制来处理它。 - KeepAliveTime和allowCoreThreadTimeout通常可以满足1.5.2.2的要求。

如何动态设置参数才能生效。参考:Spring的ThreadPoolTask??Executor类(对JDK ThreadPoolExecutor的一层包装,可以理解为装饰器模式)的setCorePoolSize方法。

也就是说,原生JDK本身就提供了动态修改线程池参数的方法。这个时候你有没有发现自己已经不擅长学习了?或者源代码是最好的书吗? 2.总结希望这篇文章可以帮助大家理解线程池是如何引入的?多线程解决了什么问题?线程池原理是如何解决痛点的?那么企业在实践中会遇到哪些问题呢?而美团公司又是如何解决的呢?希望这篇文章对您有所帮助,系统梳理一下知识。

线程池介绍及实际案例分享

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 沃峰科技助力企业客户服务升级,全面解决全国门店运维问题

    沃峰科技助力企业客户服务升级,全面解决全国门店运维问题

    .wp-block-column h3{margin-left:0} 在快速发展的商业环境中,企业客户服务始终是关键竞争力一。 然而,全国不少企业在门店运维服务中面临数字化系统缺失、智能化不足、线上线下分离等一系列挑战,直接影响服务效率和客户满意度。 针对这些痛点,沃峰科技推出了一整套覆盖全

    06-18

  • 诺初美创获数千万元天使轮融资,时代伯乐、莱斯创投联合投资

    诺初美创获数千万元天使轮融资,时代伯乐、莱斯创投联合投资

    投资圈(ID:pedaily)据6月8日消息,跨境智能家居品牌“诺初美创”已近期完成数千万元天使轮融资。 本轮融资由时代伯乐和莱斯创投共同投资。 本次募集资金将主要用于新产品研发。 诺初美创于今年8月上台。 面向25-45岁的家庭消费者,专注于家庭消费场景的产品创新和品牌运营

    06-17

  • 重庆两江新区设立4支新产业基金 总规模45.5亿

    重庆两江新区设立4支新产业基金 总规模45.5亿

    据投资界9月22日消息,重庆两江战略基金举办重点合作项目专场签约活动,设立4支新产业基金,并签约5个投资协议。 总投资规模45.5亿元。 签约项目涵盖大健康、智能制造、新基建、航空航天、人工智能、国际贸易、数字经济等多个产业领域,将助力两江新区进一步深化大数据智能创

    06-17

  • Xilinx 首席执行官概述公司新愿景和战略蓝图

    Xilinx 首席执行官概述公司新愿景和战略蓝图

    2020 年 3 月 19 日,加利福尼亚州圣何塞 — 全球自适应和智能计算领导者 Xilinx, Inc.(纳斯达克代码:XLNX)总裁兼首席执行官(首席执行官彭维克今天透露了公司的未来愿景和战略蓝图。 Peng的愿景是为Xilinx带来新发展、新技术和新方向,打造“自适应计算加速平台”。 在这

    06-06

  • 小家电品牌“豆禾科技”获近亿元A轮融资,

    小家电品牌“豆禾科技”获近亿元A轮融资,

    深耕供应链的小家电品牌“豆禾科技”已完成近亿元A轮融资。 本轮融资由鸿章资本投资,Verity Capital 跟投。 独家财务顾问。 本轮融资将主要用于产品研发、供应链升级、企业信息化建设等。

    06-17

  • 喝了还能降解的“食用标签”让假酒、假药无处藏身

    喝了还能降解的“食用标签”让假酒、假药无处藏身

    食品药品安全时刻关系着人们的生活。 然而,各类假冒伪劣产品始终令人防不胜防。 想要辨别真伪,可能需要有“火眼金睛”,但显然不可能每个人都具备这样的能力。 然而,在现代社会,你可以用科技来辅助。 ▲ 图片来自:Unsplash 美国印第安纳州Purdue大学和韩国国家农业科学

    06-21

  • Whole House Premium对美国第一贸易公司进行数百万美元战略投资

    Whole House Premium对美国第一贸易公司进行数百万美元战略投资

    据投资界8月7日消息,国内一站式家居软装解决方案Whole House Premium,近期又有新动作。 他向美国第一家贸易公司First Trade投资100万,并正式成为First Trade的股东。   全屋优品创始人周志胜介绍,公司已完成1万元B轮融资。 全屋优品成立仅两年,就以其对市场整体专业的

    06-18

  • 台积电抢购EUV光刻机加速7nm-5nm量产进程

    台积电抢购EUV光刻机加速7nm-5nm量产进程

    日前,荷兰半导体设备制造商ASML(阿斯麦)在财报发布会上表示,ASML将采用极紫外光刻机(EUV) 2020年,年出货量从18台增至30台,外媒报道称,晶圆代工厂龙头台积电将抢占30台EUV台的一半以上。 这也将使台积电成为今年的第一。 包含EUV技术的增强型7纳米工艺可于第一季度中

    06-06

  • 挑战闲鱼、转转,京东正式推出“拍拍二手”,会扰乱二手车市场吗?

    挑战闲鱼、转转,京东正式推出“拍拍二手”,会扰乱二手车市场吗?

    二手交易平台以“焕然一新”迎接新玩家。 12月21日,刘强东宣布京东正式上线“拍拍二手”品牌。 它将采用平台化运营思路,整合回收、检测、再加工、销售等逆向供应链资源,高举“品质二手”大旗。 将京东联盟生态拓展至二手商品交易领域。 拍拍二手是由拍拍网发展而来,拍拍网

    06-17

  • 徐小平:创业者看不起英雄,不愿意给他钱

    徐小平:创业者看不起英雄,不愿意给他钱

    在天使来华“两会大众创业”年度盛典上,徐小平回忆起一年来令他印象深刻的一件事: 2018年10月在北大演讲时,一名学生告诉他,学生中存在着职业鄙视链:在四大工作的人鄙视在快消工作的人,在咨询工作的人鄙视在四大工作的人,在投行工作的人鄙视在咨询工作的人,在PE工作的

    06-18

  • 超过110亿元!北汽新能源汽车创下行业最大单笔融资,为何全部退出……

    超过110亿元!北汽新能源汽车创下行业最大单笔融资,为何全部退出……

    过亿的融资金额对于新能源来说算大吗?    据投资界8月14日消息,北汽新能源今日正式宣布,公司已完成总额1800万元B轮融资,中国信达、中基投资、兴旺产业园、国轩投资共14家投资者参与了本轮融资。   创下新能源汽车行业单笔最大融资纪录,并已在筹备IPO。    据了解

    06-18

  • 市值破万亿,王传福表弟一次性返还5万倍

    市值破万亿,王传福表弟一次性返还5万倍

    这是一个里程碑时刻——6月10日,比亚迪股价创历史新高,市值首次突破万亿,成为第一个加入万亿美元市值俱乐部的中国人。 汽车公司。 早在2009年,29岁的王传福在深圳创立了比亚迪。 从一块小小的手机电池起家,后来打造了一个巨大的新能源汽车版图:新能源汽车、动力电池、半

    06-17