探索并发编程:深入理解线程池
文章目录
- 前言
- 一、线程池是什么?
- 二、如何创建线程池
- 1.使用Executors类
- 2.使用ThreadPoolExecutor类手动配置线程池
- 总结
前言
随着计算机系统的不断发展和进步,我们需要处理更多的并发任务和复杂的操作。而线程池作为一种高效的线程管理机制,可以帮助我们更好地利用系统资源,提高程序的性能和响应速度,本文将给大家介绍下线程池这一技术。
一、线程池是什么?
线程池是一种并发编程的概念和机制,用于管理和调度多个线程执行任务。它由一组预先创建的线程组成,这些线程可以重复使用来处理多个任务,而不需要频繁地创建和销毁线程。通俗地来讲,当我们需要穿衣服时,线程池就像是一个方便的衣柜。我们不必每次都去新建一件衣服(新建线程),而是可以直接从衣柜里拿出一件合适的衣服(复用线程)。当我们穿完衣服后,将它放回衣柜中(线程完成任务后回到线程池)。这样做的好处是避免了频繁创建和销毁衣服(线程),节省了时间和资源。哈哈哈,不知道恰不恰当呢。
二、如何创建线程池
创建线程池有两种常见的方式:第一种是使用 Executors 类提供的工厂方法,第二种是直接使用 ThreadPoolExecutor 类进行手动配置。下面我将分别解释这两种方法。
1.使用Executors类
在 Java 中,Executors 类提供了一些静态工厂方法,用于创建不同类型的线程池。以下是几种常见的方法:
-
newFixedThreadPool(int Threads): 创建一个固定大小的线程池,其中包含指定数量的线程。
-
newCachedThreadPool(): 创建一个可缓存的线程池,线程池的大小可以根据需求自动调整。
-
newSingleThreadExecutor(): 创建一个单线程化的线程池,只有一个工作线程在执行任务。
-
newScheduledThreadPool(int corePoolSize): 创建一个支持定时任务和周期性任务执行的线程池。
下面是代码示例:
public static void main(String[] args) {// 创建一个固定大小为10的线程池ExecutorService threadPool = Executors.newFixedThreadPool(10);// 提交任务给线程池执行for (int i = 0; i < 20; i++) {threadPool.execute(new Runnable() {public void run() {// 任务逻辑代码...}});}// 关闭线程池threadPool.shutdown();}
2.使用ThreadPoolExecutor类手动配置线程池
如果你需要更精细的控制和灵活性,可以直接使用ThreadPoolExecutor类进行手动配置。ThreadPoolExecutor 是 ExecutorService 接口的一个实现类,它提供了更多的参数和选项,用于自定义线程池的行为。但是如果你要使用这一方法,那么你要理解这里面的七个参数,下面我来给大家介绍下:
-
corePoolSize(核心线程数):指定线程池中的核心线程数量。核心线程会一直保持存活状态,即使没有任务执行。当新任务到达时,如果核心线程都在忙碌,线程池会创建新线程来处理任务,直到达到核心线程数。
-
maximumPoolSize(最大线程数):指定线程池中允许的最大线程数量。当任务数量超过核心线程数且等待队列已满时,线程池会创建新线程来处理任务,直到达到最大线程数。超过最大线程数的任务会根据设置的拒绝策略进行处理。
-
keepAliveTime(空闲线程存活时间):指定非核心线程的空闲存活时间。当线程池中的线程数量超过核心线程数时,空闲的非核心线程会在指定的时间内保持存活状态。如果在此时间内没有任务到达,这些线程会被销毁。
-
unit(存活时间单位):指定空闲线程存活时间的单位,可以是纳秒、毫秒、秒等。
-
workQueue(阻塞队列):用于存储等待执行的任务的阻塞队列。当线程池中的线程都在忙碌时,新任务会被放入这个队列中等待执行。
-
threadFactory(线程工厂):用于创建新线程的工厂类。通过自定义线程工厂,你可以为线程池创建具有特定属性的线程。
-
handler(拒绝策略):指定当线程池无法执行新任务时的处理策略。常见的拒绝策略包括抛出异常、丢弃任务、丢弃队列中最早的任务或在调用者线程中直接执行任务。
下面是自定义创建线程池的示例:
private int corePoolSize = 5;// 核心线程数private int maximumPoolSize = 200;// 最大线程数private int keepAliveTime = 0;// 活跃超时时间private TimeUnit unit = TimeUnit.MILLISECONDS;// 毫秒// 保证对象可见性private volatile ThreadPoolExecutor threadPoolExecutor;public void thread() {threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit,new ArrayBlockingQueue<Runnable>(10), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
总结
以上就是今天要讲的内容,本文仅仅简单介绍了线程池及其创建方法,后续我将会给大家讲解线程池在项目中的具体使用以及关于线程池的更多内容。
相关文章:
探索并发编程:深入理解线程池
文章目录 前言一、线程池是什么?二、如何创建线程池1.使用Executors类2.使用ThreadPoolExecutor类手动配置线程池 总结 前言 随着计算机系统的不断发展和进步,我们需要处理更多的并发任务和复杂的操作。而线程池作为一种高效的线程管理机制,…...
html5cssjs代码 023 公制计量单位进位与换算表
html5&css&js代码 023 公制计量单位进位与换算表 一、代码二、解释 这段HTML代码定义了一个网页,用于展示公制计量单位的进位与换算表。 一、代码 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"utf-8&quo…...
UE5.3 StateTree使用实践
近期浏览UE的CitySample(黑客帝国Demo),发现有不少逻辑用到了StateTree学习一下,StateTree是多层状态机实现,以组件的形式直接挂载在蓝图中运行。 与平时常见的一些FSM库不同,StateTree并不会返回给外界当…...
【09】进阶JavaScript事件循环Promise
一、事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 何为线程? 有了进程后,就可以运行程序的代码了。 运行代码的「人」称之…...
蓝桥备赛----基本语法总结
文章目录 输入输出知识点总结 输入 单个 #单个输入n input() #无参数 默认返回字符串n input("有提示参数的输入") #有提示性输入语句的输入,仍是以str类型返回n int(input()) #根据给定的类型输入,返回值类型intn float(input()) #根据…...
基于 Echarts + Python Flask ,我搭建了一个动态实时大屏监管系统
一、效果展示 1. 动态实时更新数据效果图 2. 鼠标右键切换主题 二、确定需求方案 支持Windows、Linux、Mac等各种主流操作系统;支持主流浏览器Chrome,Microsoft Edge,360等;服务器采用python语言编写,配置好python环…...
针对教育行业的网络安全方案有哪些
智慧校园”是教育信息化进入高级阶段的表现形式,比“数字校园”更先进。集体知识共融、共生、业务应用融合创新、移动互联网物联网高速泛在是其重要特征。特别是在互联网教育的大环境下,为了更好的发挥智慧化教学服务和智慧化教学管理功能,需…...
C++ 编程入门指南:深入了解 C++ 语言及其应用领域
C 简介 什么是 C? C 是一种跨平台的编程语言,可用于创建高性能应用程序。 C 是由 Bjarne Stroustrup 开发的,作为 C 语言的扩展。 C 为程序员提供了对系统资源和内存的高级控制。 该语言在 2011 年、2014 年、2017 年和 2020 年进行了 4…...
latex变量上下加自适应长度箭头
latex变量上下加自适应长度箭头 在变量上加箭头的代码如下 % 在上 \overrightarrow{A B} \overleftarrow{A B} % 在下 \underrightarrow{A B} \underleftarrow{A B}得出的结果依次如下 A B → , A B ← , A B → , A B ← \overrightarrow{A B},\overleftarrow{A B}, \under…...
鸿蒙4.0ArkUI快速入门(一)应用模型
ArkUI篇 应用模型Stage模型FA模型模型对比 应用模型 应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼,它提供了应用程序必备的组件和运行机制。 HarmonyOS先后提供了两种应用模型: FA(Feature Ability)模型&…...
C++ UML类图
参考文章: (1)C UML类图详解 (2)C基础——用C实例理解UML类图 (3)C设计模式——UML类图 (4)[UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之…...
Java SE入门及基础(44)
目录 I / O流(上) 1. 什么是I / O流 过程分析 I / O的来源 Java 中的 I / O流 2. 字节流 OutputStream 常用方法 文件输出流 FileOutputStream 构造方法 示例 InputStream 常用方法 文件输入流 FileInputStream 构造方法 示例 综合练习 字节流应用场景 Java SE文…...
基于Wechaty的微信机器人
git地址:GitHub - wechaty/getting-started: A Starter Project Template for Wechaty works out-of-the-boxhttps://github.com/wechaty/getting-started 在 Terminal中npm install 下载node包 加载完成后。npm start 启动 扫描二维码,即可登录微信web端…...
【C++ leetcode】双指针问题(续)
3. 202 .快乐数 题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结…...
51单片机-蜂鸣器
1.蜂鸣器的介绍 无源蜂鸣器不能一直通电,无源蜂鸣器内部的线圈较小,易烧坏 蜂鸣器的驱动 达林顿晶体管(npn型) 应用: 按下独立按键同时蜂鸣器响起提示音,数码管显示对应的独立按键键码 #include <REG…...
【MySQL】学习和总结使用列子查询查询员工工资信息
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-5odctDvQ0AHJJc1C {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...
突破编程_C++_STL教程( stack 的实战应用)
1 std::stack 应用于自定义数据结构 通常,std::stack 用于存储基本数据类型,如 int、float、char 等。然而,std::stack 同样可以存储自定义的数据结构,只要这些数据结构满足一定的要求。 (1)存储自定义数…...
Spring Data访问Elasticsearch----其他Elasticsearch操作支持
Spring Data访问Elasticsearch----其他Elasticsearch操作支持 一、索引设置二、索引映射三、Filter Builder四、为大结果集使用滚动Scroll五、排序选项六、运行时字段6.1 索引映射中的运行时字段定义6.2 在查询上设置的运行时字段定义 七、Point In Time (PIT) API八、搜索模板…...
代码随想录算法训练营第60天 | 84.柱状图中最大的矩形
单调栈章节理论基础: https://leetcode.cn/problems/daily-temperatures/ 84.柱状图中最大的矩形 题目链接:https://leetcode.cn/problems/largest-rectangle-in-histogram/description/ 思路: 本题双指针的写法整体思路和42. 接雨水是一…...
【讲解Node.js常用的命令】进阶版
Node.js常用命令 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它使得可以在服务器端运行 JavaScript 代码。Node.js 采用了事件驱动、非阻塞 I/O 模型,非常适用于构建高效的网络应用程序。以下是一些Node.js开发中常用的命令࿱…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
