Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

    • Java基础

    • Java集合

    • Java并发

      • 共享变量副本与 主内存共享变量的区别
      • 创建线程池的几种方式
      • 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,为什么
      • 异步编程工具CompletableFuture
    • JVM

  • Spring

  • SpringCloud

  • MySQL

  • Redis

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • Java
  • Java并发
plantre
2025-05-08

创建线程池的几种方式

在Java中,创建线程池主要有以下几种方式,每种方式适用不同的场景并具有独特的特点:


1. 使用 Executors 工厂类

Executors 提供了静态方法快速创建预定义类型的线程池,适合快速实现基础需求,但需注意潜在资源风险:
• 固定大小线程池(newFixedThreadPool):

核心线程数与最大线程数相等,适用于任务量稳定且需要控制并发数的场景。例如处理批量计算任务。

ExecutorService fixedPool = Executors.newFixedThreadPool(5);
1

• 缓存线程池(newCachedThreadPool):

线程数无上限(受系统资源限制),空闲线程60秒回收,适用于短时高并发任务(如Web请求)。

ExecutorService cachedPool = Executors.newCachedThreadPool();
1

• 单线程池(newSingleThreadExecutor):

仅一个线程顺序执行任务,适用于需要严格顺序执行的场景(如日志记录)。

ExecutorService singlePool = Executors.newSingleThreadExecutor();
1

• 调度线程池(newScheduledThreadPool):

支持定时或周期性任务,如定时数据同步。

ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(3);
1

注意:Executors 的默认实现可能因使用无界队列(如 LinkedBlockingQueue)导致内存溢出,生产环境需谨慎使用。


2. 手动配置 ThreadPoolExecutor

通过构造函数自定义参数,提供更精细的控制,推荐生产环境使用:

ThreadPoolExecutor customPool = new ThreadPoolExecutor(
    5,                      // 核心线程数
    10,                     // 最大线程数
    60L, TimeUnit.SECONDS,  // 非核心线程空闲存活时间
    new ArrayBlockingQueue<>(100),  // 有界任务队列(避免内存溢出)
    Executors.defaultThreadFactory(), 
    new ThreadPoolExecutor.AbortPolicy()  // 拒绝策略
);
1
2
3
4
5
6
7
8

核心参数说明:
• 队列类型:推荐有界队列(如 ArrayBlockingQueue)防止任务堆积。

• 拒绝策略:支持 AbortPolicy(抛异常)、CallerRunsPolicy(提交线程执行任务)等。


3. 使用第三方库

• Google Guava:提供 MoreExecutors 和 ListeningExecutorService,支持增强功能(如回调)。

ExecutorService guavaPool = MoreExecutors.newDirectExecutorService();
1

• Spring框架:通过 ThreadPoolTaskExecutor 整合线程池管理,支持Bean注入和异步注解。


4. 自定义线程池实现

在特殊场景下(如特定任务调度逻辑),可自行实现线程池。例如通过继承 Thread 并管理任务队列:

public class CustomThreadPool {
    private LinkedBlockingQueue<Runnable> taskQueue;
    private WorkerThread[] threads;

    public CustomThreadPool(int size) {
        taskQueue = new LinkedBlockingQueue<>();
        threads = new WorkerThread[size];
        // 初始化并启动工作线程
    }
}
1
2
3
4
5
6
7
8
9
10

总结与建议
• 简单场景:优先使用 Executors,但需注意队列和线程数限制。

• 生产环境:推荐手动配置 ThreadPoolExecutor,通过有界队列和合理拒绝策略规避资源风险。

• 高级需求:结合第三方库(如Guava、Spring)或自定义实现满足复杂业务逻辑。

更多细节可参考来源文档: (opens new window)、 (opens new window)、 (opens new window)。

编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05
共享变量副本与 主内存共享变量的区别
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,为什么

← 共享变量副本与 主内存共享变量的区别 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,为什么→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式