java中的线程池

news2025/8/7 3:38:14

文章目录

    • 前言
    • 线程池的优点
    • 线程池的实现原理
    • 线程池的创建
    • 线程池提交任务
    • 线程池的关闭
    • 合理配置线程池
    • 线程池的监控
    • 总结

前言

在处理一些比较复杂或者费时的任务的时候,我们常常会选择多线程的方式去处理。那么怎么创建多个线程呢,当然不可能是一个一个创建的方式创建。这时候我们通常会使用线程池创建多个线程。

线程池的优点

1.降低资源消耗。线程池可以重复利用已创建的线程。
2.提高响应速度。当任务到达的时候,可以不用创建,就能立即响应。
3.提高线程的可管性。可以统一的对线程池里的线程进行统一分配,调优和监控。

线程池的实现原理

在这里插入图片描述
如上图,是当一个任务来到之后,线程池的执行流程。接下来我们看下线程池的实现原理,如下图。
在这里插入图片描述
如图,我们可以看出,当一个线程任务到达的时候,将会放在BlockingQueue队列里,然后判断核心线程池是否满了,如果 没满,就创建线程执行任务。如果满了,就在阻塞队列里等着,当轮到自己的时候利用已有的线程执行任务.如果阻塞阻塞队列也满了.判断线程池是否满了,如果没满,就创建线程执行任务.如果满了,就执行饱和策略.
饱和策略大致有四种,就是上图的箭头4指向的小框里面的四种.

线程池的创建

我们可以通过ThreadPoolExecutor来创建一个线程池.
创建一个线程池大致需要以下几个参数(面试也会经常问)
1.corePoolSize:核心线程池数大小,在阻塞队列没满的情况下,基本都是创建和使用核心线程池的线程,完成相应的任务.
2.runnableTaskQueue(任务队列):用于保存等待执行任务的阻塞队列.之前我们有一个章节,专门介绍了阻塞队列,这里就不展开详细介绍.只介绍下有哪几种队列可以使用.
(1)ArrayBlockingQueue
(2)LinkedBlockingQueue
(3)SynchronousQueue
(4)PriorityBlockingQueue
3.maximumPoolSize:线程池的允许创建的最大线程数.
4.ThreadFactory: 用于设置创建线程的工厂.
5.RejectedExecutionHandler(饱和策略):当线程池和队列都满的时候,需要选择一种策略来处理新提交的任务.默认是AbortPolicy,一共有四种.
(1)AbortPolicy:直接抛出异常
(2)CallerRunsPolicy:只用调用者所在线程来运行任务.
(3)DiscardOldestPolicy:丢弃队列里最近一个任务,并执行当前任务.
(4)DiscardPolicy:不处理,丢弃掉
6.keepAliveTime:工作线程空闲后,保持存活的时间.
7.6的时间单位.

线程池提交任务

线程池提交任务有两个方法:execute()和submit()
execute用来提交不需要返回值的任务
submit方法用于提交需要返回值的任务.线程池会返回一个fature类型的对象,通过这个fature对象可以判断任务是否执行成功,并且可以通过get方法获取返回值

线程池的关闭

调用线程池的shutdown或shutdownNow方法来关闭线程池
shutdown首先将线程池的状态设置为STOP,然后尝试停止所有正在执行或暂停任务的线程,并返回等待执行任务的列表.
shutdownNow只是将线程池的状态设置为SHUIDOWN状态,然后中断所有没有正在执行任务的线程.

合理配置线程池

想要合理的使用线程池,就得从任务的特性分析.
任务性质:cpu密集型任务,io密集型任务和混合型任务
任务优先级:高,中,低
任务执行时间:长,中,短
任务依赖性:是否依赖其他资源
cpu密集型任务尽可能配置少的线程,如cpu数量加一个
io密集型任务尽量多配置线程,因为他的线程不一定是一直在执行任务
混合型任务:尽量将其拆分为cpu密集型任务和o密集型任务,然后按照这两种任务的处理方式处理.
优先级任务的话,不太好处理,因为操作系统不一定任java里的优先级.但是还是可以使用优先级对列处理,会比较好.
依赖型任务尽可能设置多的线程,例如数据库连接,可能需要等待返回结果,等待时间越长cpu空闲越长,所以线程数设置的越大越好.同时,最好使用有界对列,这样出现问题可以及时发现.

线程池的监控

所有的监控,基本都是获取一些主要的参数,来实现监控的目的.线程池也不例外,线程池提供了下面几个参数

takeCount:线程池所需要执行的任务数量
completedTaskCount:线程池在运行过程中已完成的任务数量
largestPoolSize:线程池里曾经创建过的最大线程数量.
getPoolSize:线程池的线程数量.
getActiveCount:获取活动的线程数

总结

希望通过今天的介绍,大家都可以对线程池有一个清晰的认知.往后在用到线程池的时候,都可以正确的使用线程池应对各种场景.

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

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

相关文章

微信如何制作自己的小程序【微信小程序】

小程序在微信的生态中,一直是比较受到企业商家的欢迎, 由于小程序的制作门槛比较低,开发人员可以根据自己喜欢的风格进行定制开发。 微信平台上,很多商家都在为制作小程序而发愁。那么微信如何制作自己的小程序呢? 一…

[附源码]java毕业设计疫情期间物资分派管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

ebay卖家开店如何做到稳定出单?自养号测评对eBay卖家有什么优势?

ebay卖家开店如何做到稳定出单,有何方法。 1、上架 ebay新账户快速下单的方式是拍卖,但拍卖价格不稳定,可能会让商家赔钱。为了快速打开新账户的局面,商家不妨在早期阶段开始拍卖,因为拍卖是最能驱动流量的。请注意&…

中国互联网众筹行业

近些年,中国互联网发展迅速,众筹这种起源于美国的新型互联网金融模式更是一直处于风口浪尖。在“大众创业、万众创新”的背景下,这种低门槛的融资模式也深受欢迎,加上阿里、京东、苏宁三大电商的巨头的相继入场,更令这…

HDC2022的无障碍参会体验,手语服务是如何做到的?

华为开发者大会2022(HDC)上,HMS Core手语数字人以全新形象亮相,并在直播中完成了长达3个多小时的实时手语翻译,向线上线下超过一千万的观众提供了专业、实时、准确的手语翻译服务,为听障人士提供了无障碍参…

组播技术→

基本概念 224.0.0.0-239.255.255.255 组播IP地址是D类。 224.0.0.0-224.0.0.255 本地网络使用,不进行路由转发。 232.0.0.0–232.255.255.255为特定源组播地址 组播mac地址的高24bit为0x01005e,mac 地址的低23bit为组播ip地址的低23bit。 组播协议 组播通信四要素 源发现…

【SpringBoot 】策略模式 之 一键切换文件上传方式

🎶 文章简介:【SpringBoot 】策略模式 之 一键切换文件上传方式 💡 创作目的:将策略模式的思想融入到java编码中,更加便捷的实现文件上传方式的切换。阿里云Oss对象存储、腾讯云Cos对象存储、七牛云Kodo对象存储以及本…

swift指针内存管理-闭包的循环引用

swift指针&内存管理-引用 无主引用 和弱引用类似,无主引用不会牢牢保持引用的实例。但是不像弱应用,无主引用假定是永远有值的 当我们去访问一个无主引用的时候,总是假定有值的,所以就可能会发生程序的崩溃 如果两个对象的…

单片机的调试接口 JTAG SWD

JTAG-DP 和 SW-DP DP?debug port SW serial wire PA13 JTMS SWDIO ------JTAG 模式选择引脚(JTMS) PA14 JTCK SWCLK ------JTAG时钟引脚(JTCK) PA15 JTDI ------JTAG 数据输入引脚(JTDI) PB3 J…

基于VitePress创建组件文档

我们准备用vitepress做我们的组件文档,方便我们浏览组件,提供使用指南给用户。 安装VitePress 安装: yarn add -D vitepress创建第一个文档: mkdir docs && echo # Hello VitePress > docs/index.md增加脚本命令&a…

十大跑步运动耳机品牌排行榜,值得推荐的六款运动耳机

除了工作时间,大多数人群都喜欢去运动健身,戴着耳机放着喜爱的音乐,慢跑在城市的每个角落里,看着各种事物,悠然自得释放压力的同时还能更加有动力去运动,不得不说,运动确实能够让我们暂时忘却烦…

算法训练Day28 | LeetCode93.复原IP地址(回溯算法中的切割问题2);78 子集(每个节点都收集结果);90.子集II(子集问题+去重)

前言:算法训练系列是做《代码随想录》一刷,个人的学习笔记和详细的解题思路,总共会有60篇博客来记录,记录结构上分为 思路,代码实现,复杂度分析,思考和收获,四个方面。如果这个系列的…

通过DIN算法进行深度特征组合商品推荐 数据+代码(可作为毕设)

案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。 方法概述:…

美团SemEval 2022结构化情感分析跨语言赛道冠军方法总结

总第547篇2022年 第064篇美团语音交互部针对跨语言结构化情感分析任务中缺少小语种的标注数据、传统方法优化成本高昂的问题,通过利用跨语言预训练语言模型、多任务和数据增强方法在不同语言间实现低成本的迁移,相关方法获得了SemEval 2022结构化情感分析…

使用dispatchEvent解决重叠元素响应事件问题

.npm 下的缓存文件太多怎么办?.npm 下缓存的包长时间未清理,占用空间太大怎么办? 查看磁盘占用情况 linux 系统里,查看磁盘占用情况:df -h 1.查看单个目录磁盘占用情况du -sh /指定目录 2.查看所有目录的磁盘占用情况…

基于VGG与LSTM实现针对图片的问答任务 数据+代码 可以作为毕设

任务描述:本教程将通过深度学习的方式实现一个简单的视觉问答模型,视觉问答的任务内容是将一张图片和一个自然语言问题作为输入,结合这两种信息,机器生成一条自然语言答案。本教程通过数据准备,视觉问答模型构建,视觉问答模型训练,视觉问答模型评估,视觉问答模型预测等…

2022年亚太C题资料汇总更新目录

1.17版本更新内容: 为大家收集了一套网上的成品论文,切记只能借鉴,不可全抄 1.16版本更新内容: 根据半成品论文中提及的加分点,为大家收集了本次比赛中作图较为好看的方式。 1.15版本更新内容: 对上传…

Hbuilder出现 CR LF

今天打开Hbuilder编辑器发现,咦,怎么变成这个样子了,我设置了啥? 最终尝试寻找了半天,原来这是显示了换行符号 ,取消这个勾选就OK

西门子S7-200 SMART(6ES7 288-1ST40-0AA0)相关与晨控智能CK-FR08-E00关于modbus tcp 通信配置指南

西门子S7-200 SMART(6ES7 288-1ST40-0AA0)相关与晨控智能CK-FR08-E00关于modbus tcp 通信配置指南 准备阶段 软件:STEP 7-MicroWIN SMART PLC:S7-200 SMATR (6ES7 288-1ST40-OAAO) 读卡器:CK-FR08-E00 交换机:标准POE交换机 电源&#x…

华为云开发者官网首页焕新升级,赋能开发者云上成长

摘要:近日,华为云开发者官网首页迎来全新改版升级。本文分享自华为云社区《华为云开发者官网首页焕新升级,赋能开发者云上成长》,作者: 华为云社区精选 。 近日,华为云开发者官网首页迎来全新改版升级&…