当前位置: 首页 > article >正文

线程池的介绍

目录

一、什么是线程池

二、线程池的详细内容

 三、线程池的简化


一、什么是线程池

提到线程池,我们可能想到 常量池,可以先来说说常量池:

像是字符串常量,在Java程序最初构建的时候,就已经准备好了,等程序运行的时候,这样的常量也就加载到内存中了,省下来构造/销毁的开销

计算机中, 这个词,就只有这一个意思,表示的含义都是一样的

一个类似的例子:

海王:一个备胎不够用,我需要同时聊多个备胎,此时这多个备胎,就构成了“备胎池”。

一池子备胎,现在虽然还没用呢,随时拿出来使用,相关的池还有,

字符串常量池,线程池,进程池,内存池,数据库连接池……

线程池,就是为了让我们高效的创建销毁线程的

最大的好处就是减少每次启动,销毁线程的销毁

最初引入线程的原因:频繁创建销毁进程,太慢了

随着发展,我们对性能要求更进一步,现在觉得频繁创建销毁进程,开销有点不能接受了,解决方案有两个:

  1. 线程池

  2. 协程(纤程,轻量级线程),这个先不说

对于线程池,可以这样理解:

把线程提前创建好,放到一个地方(放到类似于数组),需要的时候,随时去取,用完还回池子中

在详细介绍线程池之前,可能会有这样的疑惑:

为什么认为,直接创建线程开销比从池子里取线程更大呢?这里大致说明一下。

一个操作系统 = 内核 + 配套的应用程序

内核包含操作系统的各种核心功能

  1. 管理硬件设备

  2. 给软件提供稳定的运行环境

一个操作系统,内核就是一份,一份内核,要给所有的应用程序技工服务支持。

  • 如果有一段代码时应用程序中自行完成的,整个代码是可控的
  • 如果有一段代码,需要进入内核中,由内核负责完成一系列工作,这个过程,不可控,程序员写的代码干预不了

从线程池取线程的线程,纯应用程序代码就可以完成【可控】

从操作系统创建新线程,就需要操作系统内核配合完成【不可控】

使用线程池,就可以省下应用程序切换到内核中运行这样的开销

因此,通常认为,可控的过程比不可控的过程更高效

二、线程池的详细内容

Java标准库里也提供了直接使用的线程池:ThreadPoolExecutor

线程池里准备好一些线程,让这些线程,让这些线程执行一些任务

核心方法,submit(Runnable)

通过Runnable描述一段要执行的任务

通过submit任务放到线程池里,此时线程池里的线程就会执行这样的任务

构造这个类的时候,构造方法,比较麻烦(参数比较多)

 Java标准库中给了这四个构造方法,我们可以详细介绍第四个,因为这里包含前三个的所有参数。

  1. int corePoolsize,核心线程数,至少有多少个线程,线程池一创建,这些线程也要随之创建,直到整个线程池销毁,这些线程才会销毁

  2. int maximumPoolsize,最大线程数,核心线程+非核心线程(不繁忙就销毁,繁忙就再创建)线程也不是越多越好.

  3. Long keepAliveTime,非核心线程允许空闲的最大时间,(类似于允许实习生摸鱼的时间)

  4. TimeUnit unit,keepAliveTime的时间单位,是秒,分钟还是小时

  5. BlockingQueue<Runnable> workQueue 工作队列

      选择使用数组/链表,指定capacity,指定是否要带有优先级

      线程池,本质上也就是 生产者消费者模型

      调用 submit就是生产任务,线程池里的线程就是在消费任务

  6. ThreadFactory threadFactory,统一的构造并初始化线程

      工厂模式(也是一种设计模式,和单例模式是并列的关系),给线程类提供的工厂类,线程中有一些属性可以设置,线程池是一组线程

      用来弥补构造方法的缺陷,下面的代码会报错,因为触发了方法的重载

    class Point{public Point(double x, double y){}public Point(double r, double a){}
    }

    构造方法的名字是固定的,要想要提供不同的版本,就需要通过重载,有时候不一定能构成重载,这时候就需要用到工厂模式。

    工厂模式的核心,通过静态方法,把构造对象new的过程(各种属性初始化的过程)封装起来,提供多组静态方法,实现不同情况的构造。

    class Point{public static Point makePointByXY(double x, double y){Point p = new Point();//通过 x 和 y 给 p 进行属性设置return p;}public static Point makePointByRA(double r, double a){Point p = new Point();//通过 r 和 a 给 p 进行属性设置return p;}
    }
  7. RejectedExecutionHandlder handler,拒绝策略

    整个线程七个参数中,最重要的,最复杂的

    submit把任务添加到任务队列中,任务队列就是阻塞队列

    队列满了,一般不希望程序阻塞太多

    如果调用submit就阻塞(业务逻辑中的线程调用submit),就会使这个线程没法干别的事情了,不是一个好的选择,这个线程要响应用户的请求阻塞了,用户迟迟拿不到请求的回应,直观上看到的现象“卡了”

    但是与其“卡了”不如直接告诉我“失败了”有四种解决方案

 三、线程池的简化

Java标准库中,以提供了另一组类,针对ThreadPoolExecutor进行了进一步封装,简化线程池的使用,也是基于 工厂设计模式

public class demo2 {public static void main(String[] args) {//ExecutorService threadPool = Executors.newFixedThreadPool(4);ExecutorService threadPool = Executors.newCachedThreadPool();for (int i = 0; i < 1000; i++) {int id = i;threadPool.submit(() -> {System.out.println("hello" + id + "," + Thread.currentThread().getName());});}}
}

相关文章:

线程池的介绍

目录 一、什么是线程池 二、线程池的详细内容 三、线程池的简化 一、什么是线程池 提到线程池&#xff0c;我们可能想到 常量池&#xff0c;可以先来说说常量池&#xff1a; 像是字符串常量&#xff0c;在Java程序最初构建的时候&#xff0c;就已经准备好了&#xff0c;等程…...

安恒安全渗透面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...

基于瑞芯微RK3576国产ARM八核2.2GHz A72 工业评估板——ROS2系统使用说明

前 言 本文主要介绍创龙科技TL3576-MiniEVM评估板演示基于Ubuntu的ROS系统(版本:ROS2 Foxy)使用说明,包括镜像编译、镜像替换,以及ROS系统测试的方法。适用开发环境如下。 Windows开发环境:Windows 10 64bit Linux虚拟机环境:VMware16.2.5、Ubuntu22.04.5 64bit U-B…...

Python爬虫实战:获取高考网专业数据并分析,为志愿填报做参考

一、引言 高考志愿填报是考生人生的关键节点,合理的志愿填报能为其未来发展奠定良好基础。计算机类专业作为当下热门领域,相关信息对考生填报志愿至关重要。教育在线网站虽提供丰富的计算机类专业数据,但存在反爬机制,增加了数据获取难度。本研究借助 Scrapy 爬虫技术及多…...

计算机是如何工作的(上)

对于学习JavaEE初阶为什么要知道计算机是如何工作的&#xff0c;是因为在未来我们写代码的时候&#xff0c;会出现一些bug&#xff0c;而在代码层面是看不出来的&#xff0c;所以我们需要了解一些关于计算机内部是如何工作的&#xff0c;从而提高代码的健壮度。 计算机的组成&…...

基础服务系列-Windows10 安装AnacondaJupyter

下载 https://www.anaconda.com/products/individual 安装 安装Jupyter 完成安装 启动Jupyter 浏览器访问 默认浏览器打开&#xff0c;IE不兼容&#xff0c;可以换个浏览器 修改密码 运行脚本...

构造微调训练数据集

借助 ChatGPT 和 GPT API我们可以实现自动化批量构造训练数据集。 下面我们以中国古典哲学数据集为例&#xff0c;展示了自动构造训练集的主要流程: 使用 LangChain 构造训练数据样例 o基于 ChatGPT 设计 System Role 提示词 。使用 0penAI GPT-4o-mini 生成基础数据 解析 Open…...

Kubernetes架构介绍

实验环境 安装好k8s集群 一、kubernetes组件构成 1、架构图 2、组件介绍 使用以下命令查看相关资源 kubectl get nodes 查看群集节点 kubectl get ns 查看名称空间 kubectl get pod -A …...

远程服务器的mysql连接不上,问题出在哪里

使用本地ideal测试连接报错记录 排查 检查mysql服务是否正常,输入命令systemctl status mysql查看 检查端口netstat -plnt | grep mysql 最后检查服务器的防火墙设置 我以为在服务器厂商的控制面板设置放行规则就行&#xff0c;导致一直无法排查出问题&#xff0c;最后才发现由…...

Java高频面试之并发编程-04

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;调用 start()方法时会执行 run()方法&#xff0c;那为什么不直接调用 run()方法&#xff1f; 多线程中调用 start() 方法…...

【第16届蓝桥杯软件赛】CB组第一次省赛

个人主页&#xff1a;Guiat 归属专栏&#xff1a;算法竞赛 文章目录 A. 移动距离&#xff08;5分填空题&#xff09;B. 客流量上限&#xff08;5分填空题&#xff09;C. 可分解的正整数D. 产值调整E. 画展布置F. 水质检测G. 生产车间H. 装修报价 正文 总共10道题。 A. 移动距离…...

云原生--基础篇-2--云计算概述(云计算是云原生的基础,IaaS、PaaS和SaaS服务模型)

1、云计算概念 云计算是一种通过互联网提供计算资源&#xff08;包括服务器、存储、数据库、网络、软件等&#xff09;和服务的技术模式。用户无需拥有和维护物理硬件&#xff0c;而是可以根据需要租用这些资源&#xff0c;并按使用量付费。 2、云计算特点 &#xff08;1&am…...

uniapp云打包针对谷歌视频图片权限的解决方案

谷歌在24年底推出把图片和视频细分为两个权限&#xff0c;uniapp使用uni.chooseImage云打包默认图片视频为一个权限,不符合谷歌要求会被下架 解决方法&#xff0c;在项目根目录下新建AndroidManifest.xml移除不必要的权限 <?xml version"1.0" encoding"utf…...

vllm+vllm-ascend本地部署QwQ-32B

1 模型下载 可按照此处方法下载预热后的模型&#xff0c;速度较快&#xff08;推荐artget方式&#xff09; https://mirrors.tools.huawei.com/mirrorDetail/67b75986118b030fb5934fc7?mirrorNamehuggingface&catalogllms或者从hugging face官方下载。 2 vllm-ascend安…...

栈和队列--数据结构初阶(2)(C/C++)

文章目录 前言理论部分栈的模拟实现STL中的栈容器队列的模拟实现STL中的队列容器 作业部分 前言 这期的话会给大家讲解栈和队列的模拟实现和在STL中栈和队列怎么用的一些知识和习题部分(这部分侧重于理论知识&#xff0c;习题倒还是不难) 理论部分 栈的模拟实现 typedef int…...

C++常用函数合集

万能头文件&#xff1a;#include<bits/stdc.h> 1. 输入输出流&#xff08;I/O&#xff09;函数 1.1cin 用于从标准输入流读取数据。 1.2cout 用于向标准输出流写入数据。 // 输入输出流&#xff08;I/O&#xff09;函数 #include <iostream> using namespace…...

OpenGL shader开发实战学习笔记:第十二章 深入光照

1. 深入光照 1.1. 平行光 我们在前面的章节中&#xff0c;已经介绍了平行光的基本原理和实现步骤 平行光的基本原理是&#xff0c;所有的光都从同一个方向照射到物体上&#xff0c;这个方向就是平行光的方向。 1.2. 点光源 点光源的基本原理是&#xff0c;所有的光都从一个…...

CentOS7系统安装Docker教程

一、安装前准备 1、检查系统环境&#xff1a;Docker 要求系统为 64 位&#xff0c;且内核版本 3.10 以上。通过uname -r命令查看当前系统内核版本 。比如执行uname -r后&#xff0c;显示3.10.0-1160.el7.x86_64 &#xff0c;说明满足内核版本要求。 2、卸载旧版本&#xff08…...

获取电脑信息(登录电脑的进程、C盘文件信息、浏览器信息、IP)

电脑的进程信息 // 获取登录电脑的进程信息String os System.getProperty("os.name").toLowerCase();String command;if (os.contains("win")) {command "tasklist";} else {command "ps -ef";}try {Process process new ProcessB…...

PCB 射频天线设计和版图创建技巧

本文要点 射频天线有多种形式&#xff0c;从整合在芯片中的扁平天线&#xff0c;到直接印制在PCB上的铜质天线。 创建带有一个或多个天线的版图时&#xff0c;需要确保在PCB不同电路模块之间彼此隔离。 在设计一个射频天线时&#xff0c;应该使用CAD工具&#xff0c;此类…...

uniapp-商城-29-vuex 关于系统状态的管理

按照我们前面讲的&#xff0c;vuex&#xff0c;的使用方式&#xff1a; 步骤如下&#xff1a; 1 先创建store 文件夹 2 在 store 中 创建一个 index.js 3、 在 store 中&#xff0c;创建一个modules文件夹 4、在store中&#xff0c;创建一个getters.js 5、在modules文件…...

小迪安全-112-yii反序列化链,某达oa,某商场,影响分析

yii是和tp一样的框架 入口文件 web目录下 相对tp比较简单一些&#xff0c;对比tp找一下他的url结构 对应的位置结构 这个contorllers文件的actionindex就是触发的方法 控制器&#xff0c;指向的index文件&#xff0c;就可以去视图模块看index文件 这就是前端展示的文件 自…...

区间选点详解

步骤 operator< 的作用在 C 中&#xff0c; operator< 是一个运算符重载函数&#xff0c;它定义了如何比较两个对象的大小。在 std::sort 函数中&#xff0c;它会用到这个比较函数来决定排序的顺序。 在 sort 中&#xff0c;默认会使用 < 运算符来比较两个对象…...

如何在白平衡标定种构建不同类型的白平衡色温坐标系

目录 一、预备知识&#xff1a; 二、常见的白平衡色温坐标系 三、白平衡色温坐标系的理解 1&#xff09;横纵坐标轴分别代表什么含义&#xff1f; 2&#xff09;色温坐标系中原点表示什么含义&#xff1f; 3&#xff09;某M/某H的色温坐标为什么是长成这样呢&#xff1f;…...

Oracle RMAN同步数据库Active database duplicate

Active database duplicate&#xff0c;不需要先把目标数据库进行rman备份&#xff0c;只要目标数据库处于归档模式下即可直接通过网络对数据库进行copy&#xff0c;且copy完成后自动open数据库。这对于大数据特别是T级别的数据库来说优点非常明显&#xff0c;复制前不需要进行…...

Spring MVC 一个简单的多文件上传

原始代码逐行解释 PostMapping("/uploads") // ① 声明处理POST请求&#xff0c;路径为"/uploads" ResponseBody // ② 直接返回数据到响应体&#xff0c;不进行视图解析 public String uploads(MultipartFile[] files, // …...

基于DeepSeek/AI的资产测绘与威胁图谱构建

引言&#xff1a; 在网络安全攻防实践中&#xff0c;资产测绘是红队作战与蓝队安全运营的第一步&#xff0c;其本质都是通过系统性信息采集实现攻击面管理。 当前普遍存在的痛点在于&#xff0c;当企业级资产规模呈指数级增长时&#xff0c;传统基于规则引擎的低效批量处理方式…...

构建自动翻译工作流:技术与实践

一、引言 制药行业客户迫切需要一种翻译解决方案&#xff0c;以解决公司内部多样化的翻译难题。他们需要的不仅是提升翻译效率和准确性的工具&#xff0c;更希望能够保持文档的原始格式。我们观察到客户的需求广泛&#xff0c;包括多语言办公文件、研究文档和药品报批文件等&a…...

【Linux】中的网络管理

目录 1.ipv4原理&#xff0c;网关与DNS定义 2ip图形化配置--nm 2.1图形化平台配置 2.2无图形化平台配置 3.常用的网络命令--ping&#xff0c;wget&#xff0c;curl ping wget curl 4.ip命令临时配置---ifconfig&#xff0c;ip a ifconfig ip address 5.ip命令永久配…...

前端面试每日三题 - Day 10

这是我为准备前端/全栈开发工程师面试整理的第十天每日三题练习&#xff0c;涵盖&#xff1a; JavaScript 中 this 的指向详解与常见陷阱Vue 生命周期钩子的执行顺序与场景实践&#xff08;Vue2 vs Vue3&#xff09;系统设计实战&#xff1a;内容推荐系统的核心架构设计 ✅ 题…...