首页/新闻资讯/正文详情

java 线程池用法

发布时间:2026/11/3 19:28:23 来源:云帆数科 栏目:资讯中心
java 线程池用法
推荐创建线程池的方式示例代码ThreadPoolExecutor executor new ThreadPoolExecutor( 2, // 核心线程数 5, // 最大线程数 60L, // 空闲线程存活时间 TimeUnit.SECONDS, // 时间单位 new ArrayBlockingQueue(10), // 工作队列容量10 Executors.defaultThreadFactory(), // 默认线程工厂 new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略 );四种可选的拒绝策略‌AbortPolicy‌默认策略直接抛出异常任务不执行调用方能立刻感知失败。‌CallerRunsPolicy‌由提交任务的线程自己执行任务不会丢失但会拖慢调用方起到背压作用。‌DiscardPolicy‌静默丢弃新任务不抛异常任务无声消失适合可丢失的非关键任务。‌DiscardOldestPolicy‌丢弃队列中最老的任务再尝试提交新任务适合新任务比旧任务更重要的场景。‌‌‌线程池工作原理当主线程向线程池中提交一个任务时线程池检查线程数是否达到了核心线程数。如果线程池中线程数没有达到核心线程数无论线程池中的线程是否空闲都直接创建新线程来执行提交的任务。如果线程池中线程数达到了核心线程数提交上来的任务会被放入阻塞队列。此时线程池中空闲的线程会去阻塞队列中领取任务并执行。当阻塞队列也满了之后线程池会创建新的线程从阻塞队列中领取任务并执行。如果创建出了一个新的线程领取了阻塞队列里的任务此时阻塞队列不满了则不会继续创建新的线程。如果创建出了一个新的线程领取了阻塞队列里的任务立刻又有新的任务被放入阻塞队列则会继续创建新的线程去领取阻塞队列里的任务直到线程池中总线程数达到配置的最大线程数则不会继续创建新线程。如果线程池中线程数达到最大线程数阻塞队列也满了切又有新的任务试图放入阻塞队列则会触发拒绝策略。随着线程的努力工作阻塞队列中的任务逐渐的被处理掉。此时线程池中有部分线程处于空闲状态如果空闲时间达到配置的空闲线程存活时间上限则该线程会被杀死注意这里不区分最早创建出来的核心线程和后来因为阻塞队列满了而创建出来的临时线程。在线程池里所有的线程一视同仁。哪个线程空闲时间达到上限就会被杀死。1直到线程池里剩余的线程降到了核心线程数。即使线程空闲时间达到上限不会继续杀死线程。即线程池保留了配置的核心线程数量的线程个数。创建线程池为什么不推荐使用ExecutorsExecutors可以创建4种典型的线程池。‌newFixedThreadPool‌固定线程数超出任务在队列等待。适合负载稳定场景。--弊端未指定LinkedBlockingQueue容量默认容量为Integer.MAX_VALUE即阻塞队列可以无限大。‌newCachedThreadPool‌线程数不固定有空闲线程则复用否则新建空闲 60 秒回收。适合大量短生命周期异步任务。--弊端线程池里可以创建Integer.MAX_VALUE个线程。‌newSingleThreadExecutor‌单线程池保证任务顺序执行。适合需串行执行的场景。--弊端未指定LinkedBlockingQueue容量默认容量为Integer.MAX_VALUE即阻塞队列可以无限大。‌newScheduledThreadPool‌支持定时和周期任务执行。‌‌--弊端最大线程数设置为 Integer.MAX_VALUE。总结‌newFixedThreadPool 和 newSingleThreadExecutor 未指定阻塞队列长度队列默认最大长度为Integer.MAX_VALUE。大量任务提交会被塞入队列从而撑爆内存。newCachedThreadPool 和 newScheduledThreadPool 最大线程数为Integer.MAX_VALUE。大量任务提交会创建大量的线程从而撑爆内存。说明‌为什么newCachedThreadPool‌线程池 有空闲线程则复用否则新建。因为该线程池阻塞队列用的SynchronousQueue。SynchronousQueue 是 Java java.util.concurrent 包中一种特殊的阻塞队列其核心特征是‌零容量‌和‌直接传递‌。它不存储任何元素每个插入操作put/offer必须等待另一个线程的移除操作take/poll反之亦然实现生产者与消费者之间的“手递手”数据交接。/** * 底层实现 * return new ThreadPoolExecutor(0, Integer.MAX_VALUE, * 60L, TimeUnit.SECONDS, * new SynchronousQueueRunnable()); * 弊端线程池里可以创建Integer.MAX_VALUE个线程 */ ExecutorService executorService Executors.newCachedThreadPool(); /** * 底层实现 * return new ThreadPoolExecutor(nThreads, nThreads, * 0L, TimeUnit.MILLISECONDS, * new LinkedBlockingQueueRunnable()); * 弊端未指定LinkedBlockingQueue容量默认容量为Integer.MAX_VALUE即阻塞队列可以无限大 */ ExecutorService executorService1 Executors.newFixedThreadPool(10); /** * 底层实现 * super(corePoolSize, Integer.MAX_VALUE, * DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS, * new DelayedWorkQueue()); * private static final long DEFAULT_KEEPALIVE_MILLIS 10L; * * 弊端最大线程数设置为 Integer.MAX_VALUE */ ScheduledExecutorService scheduledExecutorService Executors.newScheduledThreadPool(10); /** * 底层实现 * new ThreadPoolExecutor(1, 1, * 0L, TimeUnit.MILLISECONDS, * new LinkedBlockingQueueRunnable()) * 弊端未指定LinkedBlockingQueue容量默认容量为Integer.MAX_VALUE即阻塞队列可以无限大 */ ExecutorService executorService2 Executors.newSingleThreadExecutor();

相关推荐

网络安全-Javascript基础
网络安全-Javascript基础

网络安全-Javascript基础一般简称JS,然后用于嵌套在网页中,给网页添加动态效果用的node凭条,开发服务器也是用js 后期会用到recat、vue框架。常见的前端 HTML(结构层) 利用语言去搭建网页 CSS(样式层)利用样式美化网页… · 2026/11/3 19:27:23

别再复制粘贴代码了!Python 函数从封装到递归、lambda,老哥一次讲透
别再复制粘贴代码了!Python 函数从封装到递归、lambda,老哥一次讲透

写程序最忌讳的就是复制粘贴—— 同一段代码贴三遍,改起来要改三处,累不说还容易漏。Python 给出的答案是函数:把一段会重复用的代码 "封装" 起来,起个名字,想用就调用。一、为什么用函数print() 其实就是个… · 2026/11/3 19:27:23

AdMergeX 获信通院多项认可,市场部负责人受聘铸基计划技术专家
AdMergeX 获信通院多项认可,市场部负责人受聘铸基计划技术专家

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 19:27:23

Firefox中文语言包安装与失效排查:版本匹配与多平台配置
Firefox中文语言包安装与失效排查:版本匹配与多平台配置

帮别人装浏览器这种事我干过不少回,最常被追问的一句话就是——为什么装完之后界面还是英文的?Firefox 中文语言包的安装方法看着简单,真动手的时候却总在几个地方卡住:语言包版本差一位装不上、xpi 文件拖进去没反应、装完重启还… · 2026/11/3 20:01:37

Yarn多平台安装指南与工程化实践
Yarn多平台安装指南与工程化实践

1. Yarn安装前的必要认知作为一名长期使用Node.js生态的前端开发者,我深刻体会到包管理工具的重要性。Yarn作为npm的替代方案,其核心价值在于确定性的依赖管理和卓越的安装速度。在开始安装前,我们需要明确几个关键点:Yarn的版本体… · 2026/11/3 20:01:37

RabbitMQ核心概念与高可用架构实战指南
RabbitMQ核心概念与高可用架构实战指南

1. RabbitMQ 核心概念解析RabbitMQ作为AMQP协议最成熟的实现方案,本质上是一个面向消息的中间件(MOM)。它采用Erlang语言开发,这种天生支持高并发的函数式语言赋予了RabbitMQ卓越的吞吐能力——单节点实测可达每秒数万级消息处理。… · 2026/11/3 20:01:37

RabbitMQ消息队列:核心概念与实战应用指南
RabbitMQ消息队列:核心概念与实战应用指南

1. RabbitMQ核心概念解析RabbitMQ是一个开源的消息代理和队列服务器,基于AMQP(高级消息队列协议)实现。它就像邮局系统一样工作:生产者(发送方)将消息投递到RabbitMQ服务器(邮局)&am… · 2026/11/3 20:01:37

动态规划解决股票买卖问题:原理与Python实现
动态规划解决股票买卖问题:原理与Python实现

1. 动态规划在股票买卖问题中的应用价值股票买卖时机选择一直是投资者面临的核心难题。121题"买卖股票的最佳时机"作为算法领域的经典问题,完美展示了动态规划在金融决策中的强大能力。这道题要求我们在只允许一次买卖操作的限制下,找到能获得… · 2026/11/3 20:01:37

EtherCAT从站控制器LAN9252原理与工程实践解析
EtherCAT从站控制器LAN9252原理与工程实践解析

简介:这份PDF培训材料面向工业自动化、嵌入式控制与工业互联网方向的学习者和工程师,围绕EtherCAT实时以太网协议及Microchip LAN9252从站控制器展开,适合需要理解从站开发、网络通信与实时同步机制的读者。内容从EtherCAT的周期时间、低抖动… · 2026/11/3 20:00:36

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码