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

Java线程池原理概述

Java线程池详解

一、使用方式
  1. 创建线程池
// 使用Executors工厂类
ExecutorService fixedPool = Executors.newFixedThreadPool(5); // 固定大小线程池
ExecutorService cachedPool = Executors.newCachedThreadPool(); // 弹性线程池
ExecutorService scheduledPool = Executors.newScheduledThreadPool(3); // 定时任务线程池// 手动配置(推荐)
ThreadPoolExecutor customPool = new ThreadPoolExecutor(4, // 核心线程数10, // 最大线程数60, // 空闲线程存活时间(秒)TimeUnit.SECONDS, // 时间单位new ArrayBlockingQueue<>(100) // 任务队列
);

  1. 提交任务
// 执行无返回值任务
executor.execute(() -> {System.out.println("Task running in: " + Thread.currentThread().getName());
});// 提交有返回值任务
Future<String> future = executor.submit(() -> {return "Result from " + Thread.currentThread().getName();
});
System.out.println(future.get()); // 获取结果

  1. 关闭线程池
executor.shutdown(); // 平缓关闭(执行完队列任务)
executor.shutdownNow(); // 立即关闭(尝试中断所有线程)

二、底层原理

  1. 核心组件

    • 工作队列:存储待执行任务(阻塞队列实现)
    • 工作线程集合HashSet<Worker>
    • 线程工厂ThreadFactory 创建新线程
    • 拒绝策略:当队列满时的处理机制
  2. 任务执行流程

    graph TD
    A[提交任务] --> B{核心线程空闲?}
    B -->|是| C[立即执行]
    B -->|否| D{队列未满?}
    D -->|是| E[加入队列]
    D -->|否| F{可创建新线程?}
    F -->|是| G[创建新线程执行]
    F -->|否| H[触发拒绝策略]
    

  3. 线程生命周期管理

    • 核心线程常驻(除非设置allowCoreThreadTimeOut
    • 非核心线程超时销毁
    • 线程通过Worker封装实现任务循环:
    while (task != null || (task = getTask()) != null) {task.run(); // 实际执行任务
    }
    

三、自定义线程使用
  1. 自定义线程工厂
class CustomThreadFactory implements ThreadFactory {private static final AtomicInteger poolNumber = new AtomicInteger(1);@Overridepublic Thread newThread(Runnable r) {return new Thread(r, "custom-pool-" + poolNumber.getAndIncrement() + "-thread");}
}// 使用自定义工厂
ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 10, 60, TimeUnit.SECONDS,new LinkedBlockingQueue<>(),new CustomThreadFactory()  // 注入工厂
);

  1. 自定义拒绝策略
class CustomRejectPolicy implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 自定义处理逻辑(如记录日志/存入数据库)System.err.println("Task rejected: " + r.toString());}
}// 配置拒绝策略
executor.setRejectedExecutionHandler(new CustomRejectPolicy());

  1. 扩展线程池行为
class MonitoringThreadPool extends ThreadPoolExecutor {// 重写钩子方法@Overrideprotected void beforeExecute(Thread t, Runnable r) {System.out.println("Start: " + r);}@Overrideprotected void afterExecute(Runnable r, Throwable t) {System.out.println("Finish: " + r);}
}

最佳实践建议
  1. 避免使用Executors.newFixedThreadPool()可能引发OOM(默认使用无界队列)
  2. 合理配置参数:
    • CPU密集型:核心线程数 ≈ CPU核数
    • IO密集型:核心线程数 ≈ CPU核数 * 2
  3. 使用ThreadPoolExecutor而非ExecutorService接口以便访问扩展方法
  4. 重要任务建议使用有界队列+自定义拒绝策略
http://www.dtcms.com/a/271765.html

相关文章:

  • 浏览器 实时监听音量 实时语音识别 vue js
  • 解析LLM层裁剪:Qwen实战指南
  • 搭建自动化工作流:探寻解放双手的有效方案(1)
  • Spring Boot项目中大文件上传的高级实践与性能优化
  • Spring for Apache Pulsar->Reactive Support->Message Consumption
  • Socket服务器代理工具及服务端网络转发中枢
  • 【Action帧简要分析】
  • iOS APP混合开发性能测试怎么做?页面卡顿、通信异常的工具组合实战
  • iOS Widget 开发-7:TimelineProvider 机制全解析:构建未来时间线
  • 在 MacOS 上安装和配置 Kafka
  • 深入理解 Linux 中的 stat 函数与文件属性操作
  • 每天一个前端小知识 Day 29 - WebGL / WebGPU 数据可视化引擎设计与实践
  • 在Linux上使用libasan开发QT程序定位内存问题
  • Spring AI 系列之七 - MCP Client
  • 限流式保护器如何筑牢无人驾驶汽车充电站的安全防线
  • linxu内核的signal fault和arm内核的flault
  • 【LeetCode100】--- 2.字母异位词分组【复习回顾】
  • 如何发现 Redis 中的 BigKey?
  • 正向代理服务器Squid:功能、架构、部署与应用深度解析
  • 黄瓜苦多于意外,苦瓜苦来自本源——“瓜苦”探源
  • CloudCanal:一款企业级实时数据同步、迁移工具
  • 浪潮CD1000-移动云电脑-RK3528芯片-2+32G-开启ADB ROOT破解教程
  • tomcat源码02 - 理解Tomcat架构设计
  • MyBatis集成Logback日志全攻略
  • 微软云语音识别ASR示例Demo
  • 激活函数与损失函数:神经网络的动力引擎与导航系统
  • defer学习指南
  • 《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
  • 启辰智慧预约团队5周年活动掠影,打造一流预约系统
  • 论文精读(一)| 量子计算系统软件研究综述