线程池概述

Java线程池是一种池化技术,用于管理和复用线程,减少线程创建和销毁的开销,提高系统性能。Java通过java.util.concurrent包提供了强大的线程池支持。

线程池参数详解

1. 核心参数

// 创建线程池的完整构造函数
ThreadPoolExecutor(int corePoolSize,              // 核心线程数int maximumPoolSize,           // 最大线程数long keepAliveTime,            // 空闲线程存活时间TimeUnit unit,                 // 时间单位BlockingQueue<Runnable> workQueue, // 工作队列ThreadFactory threadFactory,   // 线程工厂RejectedExecutionHandler handler  // 拒绝策略处理器
)

2. 参数详细说明

corePoolSize(核心线程数)
  • 线程池中保持的最小线程数量,即使它们是空闲的

  • 除非设置了allowCoreThreadTimeOut,否则核心线程不会因空闲而被回收

maximumPoolSize(最大线程数)
  • 线程池允许创建的最大线程数量

  • 当工作队列满时,线程池会创建新线程直到达到此限制

keepAliveTime(线程空闲时间)
  • 当线程数大于核心线程数时,空闲线程在终止前等待新任务的最长时间

  • 仅适用于超出核心线程数的线程

unit(时间单位)
  • keepAliveTime参数的时间单位

  • 如TimeUnit.SECONDS、TimeUnit.MILLISECONDS等

workQueue(工作队列)
  • 用于保存等待执行的任务的阻塞队列

  • 常见实现:

    • ArrayBlockingQueue:有界队列

    • LinkedBlockingQueue:无界队列(默认Integer.MAX_VALUE)

    • SynchronousQueue:不存储元素的队列

    • PriorityBlockingQueue:具有优先级的队列

threadFactory(线程工厂)
  • 用于创建新线程的工厂

  • 可以自定义线程名称、优先级等

handler(拒绝策略)
  • 当线程池和工作队列都满时,处理新提交任务的策略

  • 内置策略:

    • AbortPolicy:默认策略,抛出RejectedExecutionException

    • CallerRunsPolicy:由调用线程执行该任务

    • DiscardPolicy:直接丢弃任务

    • DiscardOldestPolicy:丢弃队列中最旧的任务并尝试重新提交

线程池工作流程

  1. 提交任务时,如果当前线程数小于corePoolSize,创建新线程执行任务

  2. 如果线程数达到corePoolSize,新任务被放入工作队列

  3. 如果工作队列已满且线程数小于maximumPoolSize,创建新线程执行任务

  4. 如果线程数达到maximumPoolSize且队列已满,触发拒绝策略

代码示例

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;public class ThreadPoolDemo {// 任务计数器private static AtomicInteger taskCount = new AtomicInteger(1);public static void main(String[] args) {// 创建线程池ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // 核心线程数5, // 最大线程数60, // 空闲线程存活时间TimeUnit.SECONDS, // 时间单位new ArrayBlockingQueue<>(10), // 工作队列(容量10)new CustomThreadFactory(), // 自定义线程工厂new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略);// 提交20个任务for (int i = 0; i < 20; i++) {try {executor.execute(new Task("Task-" + i));} catch (RejectedExecutionException e) {System.out.println("任务被拒绝: " + i);}}// 关闭线程池executor.shutdown();}// 自定义任务static class Task implements Runnable {private String name;public Task(String name) {this.name = name;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " 执行 " + name);try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " 完成 " + name);}}// 自定义线程工厂static class CustomThreadFactory implements ThreadFactory {private AtomicInteger threadCount = new AtomicInteger(1);@Overridepublic Thread newThread(Runnable r) {Thread thread = new Thread(r, "CustomThread-" + threadCount.getAndIncrement());thread.setDaemon(false);thread.setPriority(Thread.NORM_PRIORITY);return thread;}}
}

常用预定义线程池

Java通过Executors类提供了几种常用的线程池:

  1. newFixedThreadPool:固定大小线程池

  2. newCachedThreadPool:可缓存线程池

  3. newSingleThreadExecutor:单线程线程池

  4. newScheduledThreadPool:定时任务线程池

// 使用示例
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

注意事项

  1. 合理设置线程池大小,考虑CPU核心数和任务类型(I/O密集型或CPU密集型)

  2. 避免使用无界队列,可能导致内存溢出

  3. 根据业务需求选择合适的拒绝策略

  4. 使用自定义线程工厂便于问题排查和监控

  5. 正确关闭线程池,调用shutdown()或shutdownNow()

线程池是Java并发编程中的重要组件,合理使用可以显著提高应用程序的性能和稳定性。

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

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

相关文章

K8S 部署 NFS Dynamic Provisioning(动态存储供应)

K8S 部署 NFS Dynamic Provisioning&#xff08;动态存储供应&#xff09; 本文档提供完整的 K8s NFS 动态存储部署流程&#xff0c;包含命名空间创建、RBAC 权限配置、Provisioner 部署、StorageClass 创建及验证步骤。 2. 部署步骤 2.1 创建命名空间 首先创建独立的命名空间 …

JavaEE 进阶第二期:开启前端入门之旅(二)

专栏&#xff1a;JavaEE 进阶跃迁营 个人主页&#xff1a;手握风云 目录 一、VS Code开发工具的搭建 1.1. 创建.html文件 1.2. 安装插件 1.3. 快速生成代码 二、HTML常见标签 2.1. 换行标签 2.2. 图片标签: img 2.3. 超链接 三、表格标签 四、表单标签 4.1. input标…

【RNN-LSTM-GRU】第二篇 序列模型原理深度剖析:从RNN到LSTM与GRU

本文将深入探讨循环神经网络&#xff08;RNN&#xff09;的核心原理、其面临的长期依赖问题&#xff0c;以及两大革命性解决方案——LSTM和GRU的门控机制&#xff0c;并通过实例和代码帮助读者彻底理解其工作细节。1. 引言&#xff1a;时序建模的数学本质在上一篇概述中&#x…

Qt---状态机框架QState

QState是Qt状态机框架&#xff08;Qt State Machine Framework&#xff09;的核心类&#xff0c;用于建模离散状态以及状态间的转换逻辑&#xff0c;广泛应用于UI交互流程、设备状态管理、工作流控制等场景。它基于UML状态图规范设计&#xff0c;支持层次化状态、并行状态、历史…

GitHub 热榜项目 - 日榜(2025-09-02)

GitHub 热榜项目 - 日榜(2025-09-02) 生成于&#xff1a;2025-09-02 统计摘要 共发现热门项目&#xff1a;14 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现AI Agent生态爆发趋势&#xff0c;Koog、Activepieces等项目推动多平台智能体开发框架成熟。语…

华为卫星对星引导技术深度解析:原理、实现与开源替代方案

利号&#xff1a;CNXXXXXX 涉及多传感器融合/自适应波束成形/轨道预测算法一、技术原理剖析&#xff1a;卫星间高精度指向的核心挑战在低轨卫星&#xff08;LEO&#xff09;星座中&#xff0c;卫星间链路&#xff08;ISL&#xff09;的建立面临三大技术难题&#xff1a;1. 动力…

水下管道巡检机器人结构设cad+三维图+设计说明书

目 录 1 绪论 1 1.1 选题的背景及意义 1 1.2 水下管道巡检机器人的分类 2 1.2.1 管道巡检技术的分类 2 1.2.2管道巡检机器人的分类 2 1.3 研究的现状 3 1.3.1 国内的研究现状 3 1.3.2 国外的研究现状 4 1.4 水下管道巡检机器人的发展趋势 5 1.…

[从零开始面试算法] (11/100) LeetCode 226. 反转二叉树:递归的“镜像”魔法

引言 欢迎来到本系列的第十一篇&#xff01;在我们通过“最大深度”问题初步领略了树的递归之美后&#xff0c;今天我们将面对一个更能体现递归“分治”思想的经典问题——LeetCode 226. 反转二叉树。 这道题在面试界的地位非同凡响&#xff0c;它因 Homebrew 的作者 Max How…

Java设计模式之创建型—建造者模式

Java中最常用的设计模式-CSDN博客 “把对象的构造步骤拆成链式方法&#xff0c;调用者按需填参&#xff0c;最后一次性 build&#xff0c;避免构造函数爆炸。” 经典场景 参数多&#xff08;>4 个&#xff09;且大部分可选 需要不可变对象&#xff08;final 字段&#xf…

网页计时器,支持多计时器管理、数据分享、用户数据同步、全屏展示等功能,可进行倒计时、正计时和显示世界时钟。

一个具有现代化 UI 和交互的计时器网页应用&#xff0c;支持多计时器管理、数据分享、用户数据同步、全屏展示等功能&#xff0c;可进行倒计时、正计时和显示世界时钟。它采用玻璃态设计和流畅动画效果&#xff0c;提供极佳的视觉体验。 特点&#xff1a; 支持多个计时器的创建…

纹理融合——用 TypeScript + Babylon.js 打造“可混合纹理序列”

我不想搞个一新的Shader&#xff0c;我就想用已有的材质&#xff08;比如StandardMaterial和PBRMetallicRoughnessMaterial&#xff09;实现纹理融合渐变等效果&#xff0c;于是我搞了一个TextureBlender。一、为什么重复造轮子&#xff1f;GPU 插值受限material.diffuseTextur…

【完整源码+数据集+部署教程】公交车部件实例分割系统源码和数据集:改进yolo11-fasternet

背景意义 随着城市化进程的加快&#xff0c;公共交通系统的需求日益增加&#xff0c;公交车作为城市交通的重要组成部分&#xff0c;其运行效率和安全性直接影响到城市的交通状况和居民的出行体验。因此&#xff0c;公交车的维护和管理显得尤为重要。在这一背景下&#xff0c;公…

【C++题解】关联容器

关于set&#xff0c;map以及变种 |关联容器| set&multiset | map&multimap |无序关联容器| Unordered set&multiset | Unordered map&multimap | 建议先了解之后再配合练习 这次练习CCF真题比较多&#xff0c;也比较基础&#xff0c;预计耗时不用这么久。 今天…

【智谱清言-GLM-4.5】StackCube-v1 任务训练结果不稳定性的分析

1. Prompt 我是机器人RL方向的博士生正在学习ManiSkill&#xff0c;在学习时我尝试使用相同命令训练同一个任务&#xff0c;但是我发现最终的 success_once 指标并不是相同的&#xff0c;我感到十分焦虑&#xff0c; 我使用的命令如下&#xff1a; python sac.py --env_id&qu…

MySQL 8.0 主从复制原理分析与实战

MySQL 8.0 主从复制原理分析与实战半同步复制设计理念&#xff1a;复制状态机——几乎所有的分布式存储都是这么复制数据的基于全局事务标识符&#xff08;GTID&#xff09;复制GTID工作原理多主模式多主模式部署示例课程目标&#xff1a; MySQL 复制&#xff08;Replication&a…

[UT]记录case中seq.start(sequencer)的位置变化带来的执行行为的变化

现象&#xff1a; 代码选择打开57行&#xff0c;注释掉60行执行&#xff0c;结果58行不会打印。 代码选择打开60行&#xff0c;注释57行执行&#xff0c;结果58行正常打印。 sequence的执行需要时间&#xff01;&#xff01;&#xff01; SV中代码57行切换到60行的区别&#xf…

利用keytool实现https协议(生成自签名证书)

利用keytool实现https协议&#xff08;生成自签名证书&#xff09;什么是https协议&#xff1f;https&#xff08;安全超文本传输协议&#xff09;是 HTTP 的安全版本&#xff0c;通过 SSL/TLS 加密技术&#xff0c;在客户端&#xff08;如浏览器&#xff09;和服务器之间建立加…

拆解 AI 大模型 “思考” 逻辑:从参数训练到语义理解的核心链路

一、引言&#xff1a;揭开 AI 大模型 “思考” 的神秘面纱​日常生活中的 AI 大模型 “思考” 场景呈现&#xff08;如 ChatGPT 对话、AI 写作辅助、智能客服应答&#xff09;​提出核心问题&#xff1a;看似具备 “思考” 能力的 AI 大模型&#xff0c;其背后的运作逻辑究竟是…

element plus 使用细节 (二)

接上一篇文章&#xff1a; element plus 使用细节 最近菜鸟忙于系统开发&#xff0c;都没时间总结项目中使用的问题&#xff0c;幸好还是在空闲之余总结了一点&#xff08;后续也会来补充&#xff09;&#xff0c;希望能给大家带来帮助&#xff01; 文章目录table fixed 的 v…

【机器学习学习笔记】numpy基础2

零基础小白的 NumPy 入门指南如果你想用电竞&#xff08;打游戏&#xff09;的思路理解编程&#xff1a;Python 是基础操作键位&#xff0c;而 NumPy 就是 “英雄专属技能包”—— 专门帮你搞定 “数值计算” 这类复杂任务&#xff0c;比如算游戏里的伤害公式、地图坐标&#x…