线程池与工厂模式

线程池

如果我们需要频繁的创建销毁线程,此时创建销毁线程的成本,就不能忽视了.因此就可以使用线程池.即,提前搞好一波线程,后续需要使用线程就直接从池子里拿一个即可.当线程不再使用,就放回池子里.

本来,是需要创建线程/销毁线程.现在是从池子里获取到现成的线程,并且把线程归还到池子中.

那么,为什么从池子里获取,就比从系统这里获取更高效呢?

如果是从系统这里创建线程,需要调用系统API,进一步的由操作系统内核,完成线程的创建过程(内核是给所有的进程提供服务的)是不可控的

如果是从线程池这里获取线程,上述的内核中进行的操作,都提前做好了,现在的取线程的过程,纯粹的用户代码完成(纯用户态)可控的.

也正是由于内核是给所有进程提供服务的,所以从线程池中获取的方式更快.

打个比方,就比如说你要去打印店打印

1.让柜员帮你复印:此时柜员消失在你的视野中之后可能会去做很多事情(无法掌控)

2.自己去自主复印机上复印:立即去这里复印,就可以立即把复印件拿回来(自主可控)

当然了,在Java标准库中,也提供了现成的线程池来供我们使用

好!,在上述图中出现了两个新名词:工厂类工厂方法

此时就涉及到了工厂模式

工厂模式

工厂=>生产

生产对象的

一般创建对象,都是通过 new ,通过构造方法.但是构造方法,存在重大缺陷(构造方法的名字固定就是类名)此时就可以使用工厂模式来解决上述问题了.

就比如:有的类,需要有多种不同的构造方式,但是构造方法的名字又是固定的,此时就只能使用方法重载的方式来实现了.(方法重载的前提:参数的个数和类型需要有差别)

就比如我们想要用笛卡尔坐标系以及极坐标系来表示一个点,想要用这两种方式进行构造,而这两种构造方式,参数的个数和类型是一样的!!!无法构成重载!!!.此时上述代码就会报错

使用工厂模式来解决上述问题.不使用构造方法了,使用普通的方法来构造对象.这样的方法名字就可以是任意的了.在普通方法内部,再来new对象,而且由于普通方法的目的是为了创建出对象来,这样的方法一般得是静态的

再次注意:使用static修饰的方法叫做类方法,使用static修饰的变量叫做类的成员变量,无论是类方法还是成员变量,都是可以直接通过类名来直接访问的.

此时上述的操作就叫做工厂模式,上述这两个普通的类方法就叫做工厂方法.

创建一个固定线程数量的线程池

创建出一个线程数目动态变化的线程池

创建出一个只包含单个线程的线程池(比原生的创建线程API更简单一点)

这个就类似与我们的定时器的效果,即添加一些任务,任务都在后续的某个时刻再执行.被执行的时候不是只有一个扫描线程来执行任务,可能是由多个线程共同执行所有的任务.

线程池对象搞好了之后,使用submit方法,就可以把任务添加到线程池中.

当然,既然是线程池,那创建一个任务就没意思了

除了上述这些线程池之外,标准库还提供了一个接口更丰富的线程池类

关于这串代码虽然写的是不超过4个线程,但是仍然可以在这运行100个这件事

多尝试看看源码,就会解决很多问题

ThreadPoolExecutor

这个其实是Java原生的线程池接口

其实这些东西都是为了使用方便已经去做了一层封装了,如果说你发现这样线程池不能很好的满足你的需求,那你也就可以直接去使用系统原生的线程池接口.

ThreadPoolExecutor

这个原生接口的好处就是有很多可以供我们调整的选项,就可以更好的满足我们的实际需求

经典面试题:谈谈Java标准库中的线程池的构造方法的参数和含义

int corePoolSize 核心线程数

int maximuPoolSize 最大线程数

ThreadPoolExecutor 里面的线程个数,并非是固定不变的,会根据当前任务的情况动态发生变化(自适应)

corePoolSize:至少得有这些线程,哪怕你的线程池一点任务都没有.

maximumPoolSize:最多不能超过这些线程,哪怕你的线程池忙的冒烟了,也不能比这个数目更多了.

如果把线程池比作一个公司,那么核心线程数,就是正式员工的数量.最大线程数就是正式员工+实习生的数量.当公司不忙的时候就不需要实习生,当公司业务繁忙的时候,就可以招一些实习生来分担业务,过一段时间,业务又不忙了,实习生就可以裁掉了

long keepAliveTime:这里输入数字

TimeUnit unit:这里输入单位

当有线程超过long keepAliveTime与TimeUnit unit所设定的时间阈值,那么这个线程就可以被销毁了.

BlockingQueue workQueue:管理线程池内部多个任务的阻塞队列.

线程池是内置阻塞队列的,但也可以由我们手动指定一个阻塞队列.

ThreadFactory threadFactory:工厂类,我们可以通过这个工厂类来创建线程

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

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

相关文章

BackTrader 中文文档(十)

原文:www.backtrader.com/ 用户自定义佣金 原文:www.backtrader.com/docu/user-defined-commissions/commission-schemes-subclassing/ 重塑 CommInfo 对象到实际形式的最重要部分涉及: 保留原始的 CommissionInfo 类和行为 为轻松创建用户定…

前端三剑客 —— JavaScript (第六节)

目录 内容回顾 BOM编程 DOM编程* document对象 document对象的属性 document对象的方法 DOM对象节点 操作DOM对象内容 操作DOM对象的属性 --- DOM对象.属性名称 --- DOM对象[属性名称] --- 调用系统API (Application Program interface)&#…

行业模板|DataEase批发零售大屏模板推荐

DataEase开源数据可视化分析平台于2022年6月发布模板市场(https://templates-de.fit2cloud.com),并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板,方便用户根据…

2024 年江苏省职业院校技能大赛“区块链技术应用” 赛项赛卷(样卷)运维题解析一

运维题 环境: ubuntu20 fisco 2.8.0 前言 准备两台机子,并且可以能相互pin通 192.168.19.133 [M1-A] 192.168.19.137 [M2-B] 子任务 1-2-1: 搭建区块链系统并验证 基于给定服务器环境以及软件,搭建一条双机 1 机构 8 节点 1 群组的区块 链系统(默认端口开始[30300,2020…

最优算法100例之43-包含min函数的栈

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push及pop的时间复杂…

idea 中运行spring boot 项目报 Command line is too long的解决办法。

Command line is too long 在这里选择edit configures 选择shrten command line , 选择 jar manifest 运行即可。

5G网络开通与调测ipv4

要求如下: 1. 勘站规划 1. 【重】首先观察NR频点,完成设备选型 2645--选择N41 3455--选择N78 4725--选择N79 设备选型如下:观察AAU的通道数,最大发射功率;选择N41的选型频段也要选41 2. …

04—常用方法和正则表达式

一、字符串 1.length 属性返回字符串的长度(字符数)。 2.在字符串中查找字符串 indexOf() 字符串使用 indexOf() 来定位字符串中某一个指定的字符首次出现的位置 如果没找到对应的字符函数返回-1 lastIndexOf() 方法在字符串末尾开始查找字符串出现的位置。 3.replace() 方…

WordPress 图片压缩插件:Compress JPEG PNG images 使用方法

插件介绍 Compress JPEG & PNG images是一款非常好用的图片压缩插件:,非常值得大家安装使用;特别是图片类型网站。其实我们很多服务器磁盘空间是不在乎多那么几十 MB 大小的,但是压缩了图片能提升网站速度,节省宽带&#xff…

计算机本科毕业,「就业」还是「读研」?

如果本科不错能找到较好的工作,建议直接工作,否则可以选择读研。 如果你本科毕业于一所顶尖学府,且技术实力雄厚,那么直接就业可能更为明智;对比而言读研可以为你提供更多的时间和机会去提升自己,尤其是在…

算法1: 素数个数统计

统计n以内的素数个数 素数:只能被1和自身整除的自然数,0和1除外; 举例: 输入:100 输出:25 import java.util.*; class Test1{public static void main(String[] args){int a 100; //输入数字//…

智慧矿山视频智能监控与安全监管方案

一、行业背景 随着全球能源需求的日益增长,矿业行业作为国民经济的重要支柱,其发展日益受到广泛关注。然而,传统矿山管理模式的局限性逐渐显现,如生产安全、人员监管、风险预警等方面的问题日益突出。因此,智慧矿山智…

回归预测 | Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测(完整源码…

文献阅读:Viv:在 web 上多尺度可视化高分辨率多重生物成像数据

文献介绍 「文献题目」 Viv: multiscale visualization of high-resolution multiplexed bioimaging data on the web 「研究团队」 Nils Gehlenborg(美国哈佛医学院) 「发表时间」 2022-05-11 「发表期刊」 Nature Methods 「影响因子」 47.9 「DOI…

计算机网络—传输层UDP协议:原理、应用

​ 🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:2月のセプテンバー 1:21━━━━━━️💟──────── 5:21 🔄 ◀️ ⏸ ▶️ ☰ &am…

RMT: Retentive Networks Meet Vision Transformers学习笔记

代码地址:GitHub - qhfan/RMT: (CVPR2024)RMT: Retentive Networks Meet Vision Transformer 论文地址:https://arxiv.org/pdf/2309.11523.pdf Transformer首次出现在自然语言处理领域,后来迁移到计算机视觉领域,在视觉任务中表现…

web3项目自动连接小狐狸以及小狐狸中的各种“地址”详解

刚做web3的时候,比较迷糊的就是人们口中说的各种地址,小狐狸钱包地址,私钥地址,跳转地址,接口地址,交易地址,等等XX地址,常常感觉跟做链的同事们说话不在一个频道。 这一小节&#x…

解锁生成式 AI 的力量:a16z 提供的 16 个企业指南

企业构建和采购生成式AI方面的16项改变 生成式 AI 领域趋势洞察:企业构建和采购生成式 AI 的方式正在发生重大转变,具体表现在:* 专注于可信度和安全性:75% 的企业将信任和安全性视为关键因素。* 优先考虑可扩展性和灵活性&#x…

YOLOv9/YOLOv8算法改进【NO.117】 使用Wasserstein Distance Loss改进小目标的检测效果

前 言 YOLO算法改进系列出到这,很多朋友问改进如何选择是最佳的,下面我就根据个人多年的写作发文章以及指导发文章的经验来看,按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通: 首推…

5.7打补丁—编译和官方一致的Linux_Generic包

5.7打补丁—编译和官方一致的Linux_Generic包 需求来源 某客户现场业务系统出现了查询丢失数据问题(数据库为MySQL 5.7.21,使用Linux-Generic包部署)。 已查明:丢数据问题是触发了MySQL 5.7的一个bug,该bug在5.7的后继版本已修…