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

Java 创建线程池的几种方式

在 Java 中创建线程池主要通过 java.util.concurrent 包下的 ExecutorService 接口及其实现类。以下是创建线程池的几种常见方式:


✅ 1. 使用 Executors 工具类(最简单)

ExecutorService executor = Executors.newFixedThreadPool(10);
常用方法说明:
方法描述
Executors.newFixedThreadPool(int nThreads)固定大小线程池,适合负载稳定场景
Executors.newSingleThreadExecutor()单线程池,串行执行任务
Executors.newCachedThreadPool()缓存线程池,线程可复用,适合执行大量短期异步任务
Executors.newScheduledThreadPool(int corePoolSize)支持定时与周期性任务调度的线程池

⚠️ 缺点Executors 默认线程池队列大小是无界的,可能导致 OOM,不推荐在生产中直接使用。


✅ 2. 使用 ThreadPoolExecutor 构造函数(推荐)

ExecutorService executor = new ThreadPoolExecutor(4,                      // corePoolSize10,                     // maximumPoolSize60,                     // keepAliveTimeTimeUnit.SECONDS,       // keepAliveTime 单位new LinkedBlockingQueue<>(100),  // 工作队列Executors.defaultThreadFactory(), // 线程工厂new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
参数详解:
  • corePoolSize:核心线程数

  • maximumPoolSize:最大线程数

  • keepAliveTime:非核心线程最大空闲时间

  • workQueue:任务队列(如 LinkedBlockingQueueArrayBlockingQueue

  • threadFactory:自定义线程工厂

  • handler:任务拒绝策略(如下所示)

常见拒绝策略:
策略类描述
AbortPolicy默认策略,抛出异常
CallerRunsPolicy谁提交谁执行
DiscardPolicy直接丢弃任务
DiscardOldestPolicy丢弃队列头部任务,尝试再次执行当前任务

✅ 3. 使用 ScheduledExecutorService(定时/周期任务)

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);scheduler.schedule(() -> {System.out.println("延迟3秒执行");
}, 3, TimeUnit.SECONDS);scheduler.scheduleAtFixedRate(() -> {System.out.println("每5秒执行一次");
}, 1, 5, TimeUnit.SECONDS);

✅ 4. 使用 Spring 提供的 ThreadPoolTaskExecutor(在 Spring Boot 中)

@Configuration
public class ThreadPoolConfig {@Beanpublic ThreadPoolTaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(50);executor.setKeepAliveSeconds(60);executor.setThreadNamePrefix(\"MyExecutor-\");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}
}

🔚 总结推荐

需求推荐方式
简单临时使用Executors.newFixedThreadPool
可控、适合生产自定义 ThreadPoolExecutor
定时任务调度ScheduledExecutorService
Spring 项目中ThreadPoolTaskExecutor

如果你希望我为你封装一份线程池模板代码(带监控、日志、自定义命名、注释),也可以告诉我,我来写。

Java 创建线程池的几种方式 – 菜鸟-创作你的创作

http://www.xdnf.cn/news/870139.html

相关文章:

  • Python基础:文件简单操作
  • OpenCV CUDA模块图像处理------创建CUDA加速的Canny边缘检测器对象createCannyEdgeDetector()
  • 使用 useSearchParams 的一个没有触发控制台报错的错误用法
  • STL 库基础概念与示例
  • 洛谷每日1题-------Day39__P1697 [USACO18JAN] Lifeguards B
  • Vue 生命周期全解析:从创建到销毁的完整旅程
  • Redisson - 实现延迟队列
  • 通过ca证书的方式设置允许远程访问Docker服务
  • 吴恩达机器学习讲义概述
  • 在虚拟宇宙中低语——进程间通信,Linux命名管道的前世今生
  • 哈希表入门:用 C 语言实现简单哈希表(开放寻址法解决冲突)
  • 9.RV1126-OPENCV 视频的膨胀和腐蚀
  • 基于windows系统的netcore架构与SqlServer数据库,实现双机热备。
  • 基于javaweb的SpringBoot公司日常考勤系统设计与实现(源码+文档+部署讲解)
  • 新手小白深入 BCI:实践与进阶(下)
  • 函数调用(Function Calling)
  • 子网划分例题
  • 【Git 合并冲突解决记录:从 “refusing to merge unrelated histories“ 到批量冲突处理】
  • 《高等数学》(同济大学·第7版)第一章第七节无穷小的比较
  • leetcode题解236:二叉树的最近公共祖先
  • 多层感知器MLP实现非线性分类(原理)
  • UDP包大小与丢包率的关系:原理分析与优化实践
  • 语法--06-- 简单句五大形式、系动词
  • Qwen2.5-VL - Vision Transformer(ViT)的patch 处理
  • 固定资产管理系统 ——仙盟创梦IDE
  • 华为云Flexus+DeepSeek征文|实战体验云服务器单机部署和CCE高可用的架构AI赋能
  • Android studio初体验
  • Android Studio 打包时遇到了签名报错问题:Invalid keystore format
  • Excel高级函数使用FILTER、UNIQUE、INDEX
  • 【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录、退款业务记录