ThreadPoolExecutor入门级

使用FileZilla在武汉大学IGS数据分析中心下载GNSS数据 2.依次点击如下图标下载到本地并解压安装(按系统选择要下载的版本) 阅读详情

是什么

JUC包下提供的一个线程池工具类。它帮我们解决了2个主要问题:

  1. 当需要执行大量异步任务的时候合理、有效的复用线程资源,防止多个任务创建多个线程资源。
  2. 能够有效限制和管理线程资源,比如控制初始化线程的数量,动态新增线程数等。

实现原理

本篇我们主要围绕它的核心设计思想讲解,不追踪源码。JUC包下提供了Excutors工厂类,让我们快速便捷的实例化ThreadPoolExecutor,但更建议用户通过手动实例化ThreadPoolExecutor来使用线程池。ThreadPoolExecutor构造器提供了7个初始化参数:

// 线程池的核心线程数
int corePoolSize
//线程池最大线程数
int maximumPoolSize
//超出核心线程外的线程处于空闲时能存活的时间,超过存活时间会自动被回收
long keepAliveTime
//keepAliveTime参数的时间单位
TimeUnit unit
//任务队列
BlockingQueue<Runnable> workQueue
// 创建线程的工厂
ThreadFactory threadFactory
//拒绝策略
RejectedExecutionHandler handler

现在我们带着以下2个问题逐步去理解这几个核心参数的意思以及整一个线程池的设计思想。

  1. ThreadPoolExecutor 它是如何实现线程的复用呢?
  2. 线程池的最大线程数、任务队列、拒绝策略何时会用到呢?

当用户提交任务至线程池内部会遵循这样的一个工作模型,如下图1-1:
图1-1
从图中可以看出它是一个典型的生产者、消费者模型。生产者即用户添加任务到线程池中,消费者即线程工作集执行添加进来的任务。当用户第一次提交任务,ThreadPoolExecutor发现当前线程数量小于 核心线程数会立即创建线程进行任务执行,直到超过核心线程数后会将提交的任务放入队列中,当核心线程执行完任务,会在从任务队列中取任务执行。任务队列中满时,仍然还有任务提交会判断当前线程数是否大于指定的最大线程数,如果小于则会再次创建线程来执行后面提交的任务,否则会触发任务拒绝策略。超出核心线程数外创建出来的线程在没有新任务继续提交的时候会存活keepAliveTime时间。
为了便于理解,举个例子假定我们对线程池设置如下参数

corePoolSize:3 
maximumPoolSize:8
keepAliveTime:1,
unit:分钟 
workQueue:数组阻塞队列,容量3
handler:抛出异常策略

那么此时线程池的工作模型如图1-1,下面我们分几种情况进行讨论并给出它对应的工作模型图

  1. 同一时刻用户提交了4个任务,其中3个任务分配给3个线程进行执行,其中一个任务被放入任务队列。此时线程池工作模型如图1-2:
    图1-2

  2. 同一时刻用户提交7个任务,其中3个任务分配给3个核心线程执行,3个任务放入任务队列,最后一个任务分配给 超出核心线程外的线程执行。线程池工作模型如图1-3:
    图1-3

  3. 同一时刻用户提交12任务,其中3个任务分配给3个线程执行,3个任务放入任务队列,5个任务分配给超出核心线程外的线程执行 ,最后一个任务被拒绝。线程池工作模型如图1-4
    图1-4

到这里ThreadPoolExecutor的基本原理已讲解完毕。但在我们使用线程池的时候需要注意两个点。第一,创建线程池时需要指定线程池名称,以便于后期bug排查。第二,当程序运行结束时,记得调用shutdown关闭线程池。

应用场景

对于接口中如有日志记录(写入数据到DB),可能需要耗时时间较长时,我们可以采用线程池对日志记录采用异步进行处理。

书写技术文章是一个循序渐进的过程,所以我不能保证每句话、每行代码都是对的,但至少能保证不复制、不粘贴,每篇文章都是自己对技术的认识、细心斟酌总结出来的。乔布斯说:我们在这个星球上的时间都很短,很少有机会去做几件真正伟大的事情,同时要做得好,我必须要趁我还年轻的时候完成这些事。
其实我想说的是,我是一枚程序员,我只想在有限的时间内尽可能去沉淀我这一生中所能沉淀下来的东西


清山绿水始于尘,博学多识贵于勤。

我有酒,你有故事吗?

微信公众号:「Java锦囊」。

欢迎一起谈天说地,聊Java。


装上大模型翅膀,程序员入职新公司如何快速上手代码(老员工如何选择大模型编程如虎添翼) 入职新公司,尤其是行业知识不懂的,面对前人堆积的屎山代码,各种文档又缺少的,有些技术自己又不懂的,如何快速上手代码,特别是借助AI大模型事半功倍的上手项目代码。进入新公司,我做的第一件事就是收集情报。我主动向同事们索要项目的相关资料,包括项目介绍文档、功能说明文档和业务流程图等。通过仔细阅读这些资料,可以对项目的背景和架构有了初步的了解。同时要逮住机会就向同事们请教项目的迭代历程和技术选型背后的考量。有时他们三言二语,可以为自己节省很多探索时间。在了解了项目的基本情况后,可以开始深入探究项目的业务流程。 阅读详情

相关推荐

【光学仿真】基于Matlab的LG/BG/PV/HG光束生成与特性分析【附完整源码】

本文详细介绍了如何使用Matlab进行拉盖尔-高斯(LG)、贝塞尔-高斯(BG)、完美涡旋(PV)和厄米-高斯(HG)四种特殊光束的仿真与特性分析。通过提供完整的Matlab源码,手把手指导读者生成光束、分析其强度、相位、传播特性及轨道角动量,为光学研究、激光应用及教学提供了直观高效的数值实验平台。

3a9bq4r8t2y的博客 492

ThreadPoolExecutor 基础入门

对 ThreadPoolExecutor 简单入门介绍,欢迎阅读斧正。

格物致知,知行合一。 490

知识图谱-Neo4j-开始构建知识图谱-01

关系(Relationships):连接两个节点,具有方向(→ 或 ←)和类型(Type),可附加属性。 属性(Properties):键值对,存储节点或关系的详细信息(如 , )。 (2) Cypher 查询语言 直观语法:通过模式匹配直接描述图结构。 高效遍历:支持复杂关系路径查询(如最短路径、模式匹配)。 3. 核心优势 (1) 原生图存储 物理存储优化:数据以图结构直接存储,避免传统数据库的“表连接”开销。 高效遍历:通过指针直接访问相邻节点,时间复杂度接近 O(1)。 (2) 高性

寓教于乐。教己助人 1万+

一篇文章让你彻底搞懂定时线程池ScheduledThreadPoolExecutor(深度剖析)

围绕延迟线程池,如何使用、使用场景、核心源码实现原理解析,看完即可迅速进阶

大尾巴狼学编程的博客 7633

Tartancalib标定OAK-FFC_4p(上)

1.使用Tartancalib标定双目或多目相机前,先对单个相机标定获得内参,再获得外参。

qq_51731421的博客 1277

【Web实战】微信小程序逆向

2E 70 6E 67”为带存放路径的文件名称,“00 00 11 7C”对应文件在小程序包中的具体偏移位置,“00 01 01 F7“对应文件在小程序包中的数据长度。但这并不是最初的原项目文件结构,原因是微信服务器会将小程序源码中所有的“js”文件压入“app-service.js”文件中,将所有的“json”文件压入“app-config.json”中,将所有的“wxml”文件压入“page-frame.html”文件中,“wxss”则在处理之后以“html”文件的形式存留在对应页面目录之下。

若有战,召必回 1945

Java线程池ThreadPoolExecutor详细介绍与使用

Java线程池ThreadPoolExecutor详细介绍与使用

qq_27480007的博客 1万+

anaconda的conda国内加速镜像源(pytorch 快速安装)

最近清华源不太好使了,所以推荐中科大镜像源,如下 1.还原原始通道 conda config --remove-key channels 2.

qq_41719643的博客 2万+

ThreadPoolExecutor详解

一、ThreadPoolExecutor类讲解 1、线程池状态: 五种状态: 线程池的状态 说明 RUNNING 允许提交并处理任务 SHUTDOWN 不允许提交新的任务,但是会处理完已提交的任务 STOP 不允许提交新的任务,也不会处理阻塞队列中未执行的任务, 并设置正在执行的线程的中断标志位 TIDYING .

赶路人儿 11万+

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1899

2023最新多文明策略手游《万国觉醒内购版》最新整理Linux商业手工服务端+安卓+详细搭建教程

2023最新多文明策略手游《万国觉醒内购版》最新整理Linux商业手工服务端+安卓+详细搭建教程。源码内置详细搭建教程,感兴趣可自行下载。

百创科技 1713

速看速学的Java线程池ThreadPoolExecutor极简教程

ThreadPoolExecutor 简介 ThreadPoolExecutor 是 java.util.concurrent 包下的一个类,在jdk1.5版本引入,帮助开发人员管理线程并方便地执行并行任务。 通俗来说,ThreadPoolExecutor 的作用是生产和管理线程池的,可以通过调用其 execute 方法和 submit 方法执行多线程任务。 ThreadPoolExecutor 使用 创建执行器 ExecutorService 对象和 ThreadPoolExecutor 的关系

m0_68850571的博客 499

【unity小技巧】实现FPS射击游戏枪武器随镜头手臂摇摆效果(2025/12/11补充)

如果我们视角移动转向,武器如果不跟着进行摇摆,会感觉我们的动作很生硬,特别是射击类游戏,如下实现武器摇摆这里主要分享两种实现方法,一种是改变武器位置,一种是修改武器旋转想要使用哪种方法都可以,看你自己喜欢,如果是我,我会选择第二种,比较简单,参数也少,而且个人感觉效果也更好,已枪中心做旋转更符合现实。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1470

ThreadPoolTaskExecutor和ThreadPoolExecutor

注意关系3是针对的有界队列,无界队列永远都不会满,所以只有前2种关系。

学习不止境的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Python ThreadPoolExecutor线程池

概念 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?以爬虫为例,需要控制同时爬取的线程数,例子中创建了20个线程,而同时只允许3个线程在运行,但是20个线程都需要创建和销毁,线程的创建是需要消耗系统资源的,有没有更好的方案呢?其实只需要三个线程就行了,每个线程各分配一个任务,剩下的任务排队等待,当某个线程完成了任务的时候,排队任务就可以安排给这个线程继续执行。 这就是线程池的思想(当然没这么简单),但是自己编写线程池很难写的比较完美,还需要考虑复杂情况下的线程

GMH的博客 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python中ThreadPoolExecutor的使用

Python中ThreadPoolExecutor的使用

qq_56447863的博客 3299

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java ThreadPoolExecutor的拒绝策略

一、概述 在分析ThreadPoolExecutor的构造参数时,有一个RejectedExecutionHandler参数。 RejectedExecutionHandler是一个接口: public interface RejectedExecutionHandler { void rejectedExecution(Runnable r, ThreadPoolExecu...

悟鸣的技术博客 6686

ThreadPoolExecutor

知识点提前预知: Java.util.concurrent.ThreadPoolExecutor类是ExecutorSerivce接口的具体实现。ThreadPoolExecutor使用线程池中的一个线程来执行给定的任务(Runnable或者Runnable)。 Executor是接口 只能使用execute。 ThreadPoolExecutor是实现其他线程池的核心。(ThreadPoo...

立志变成java巨头 4504

ForkJoinPool和ThreadPoolExecutor区别

ForkJoinPool和ThreadPoolExecutor的主要区别体现在任务执行的方式和适用的场景上。

刘皇叔说Java的博客 2144

【Executors和ThreadPoolExecutor】

"Executors"和"ThreadPoolExecutor"都是Java中的并发工具类,都是用来创建和管理线程池的。"Executors"是一个工厂类,它提供了创建线程池的静态方法,包括newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool等,这些方法可以创建不同类型的线程池。

学习愚公的博客 1384

ThreadPoolExecutor 详解

这是一个基于Flowable引擎(支持java、.NET),已支持MySQL、SqlServer、Oracle、PostgreSQL、DM(达梦)、 KingbaseES(人大金仓)6个数据库,支持私有化部署,前后端封装了上千个常用类,方便扩展,框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用。SynchronousQueue:直接传递队列(不存储任务,任务直接交给线程处理)。直接传递队列(SynchronousQueue):任务不存储,直接交给线程处理,适合高吞吐场景。

pantouyuchiyu的博客 858

Executors和ThreadPoolExecutor详解

概述 在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool().

川子的博客 4673

ThreadPoolExecutor 相关知识总结

ThreadPoolExecutor 参数详解、正确使用方法、运行原理总结

woniu_buhui_fei的博客 406

ThreadPoolTaskExecutor 和 ThreadPoolExecutor 的区别

ThreadPoolExecutor是Java原生的线程池类,而ThreadPoolTaskExecutor是Spring推出的线程池工具 一、从核心参数看两者关系 ThreadPoolExecutor(java.util.concurrent) public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAl.

weixin_50604409的博客 7965

ThreadPoolExecutor的源码解析

011:代表TERMINATED状态,这个状态是TIDYING状态转换过来的转换过来只需要执行一个terminated方法。解释: 如果工作线程个数小于核心线程数,满足要求,添加核心工作线程。上述条件都不符合,直接直接执行决绝策略,结束。提交的任务不能为null,否则抛空指针异常。(任务,是核心线程吗): 是否添加工作线程。是提交任务到线程池的核心方法,:是提交任务到线程池的核心方法。(上述的步骤都失败,走下面的)方法,将任务添加到阻塞队列。套了一层,进行运算时,是。,正在处理任务的线程会。

aristo 907

ThreadPoolExecutor原理详解

增加线程是通过线程池中的addWorker方法,该方法的功能就是增加一个线程,该方法不考虑线程池是在哪个阶段增加的该线程,这个分配线程的策略是在上个步骤完成的,该步骤仅仅完成增加线程,并使它运行,最后返回是否成功这个结果。线程池运行的状态,并不是用户显式设置的,而是伴随着线程池的运行,由内部来维护。任务拒绝模块是线程池的保护部分,线程池有一个最大的容量,当线程池的任务缓存队列已满,并且线程池中的线程数目达到maximumPoolSize时,就需要拒绝掉该任务,采取任务拒绝策略,保护线程池。

m0_74219798的博客 1444
上一篇: Redis入门篇(2)- 奇淫技巧
下一篇: Maven依赖详解
yi博说
博客等级 码龄11年 20粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值