JavaSE拓展:工具类Executors

一、Executors 概述

java.util.concurrent.Executors 是线程池的工具类 ,提供静态方法快速创建不同类型线程池,底层全部是封装了 ThreadPoolExecutor 的构造器,简化代码编写。

⚠️阿里巴巴开发手册强制规范:生产环境禁止使用 Executors 创建线程池 ,容易引发 OOM 内存溢出,仅用于测试、学习场景。 接口:ExecutorService 代表线程池对象。

二、Executors 4 大静态方法

1. newFixedThreadPool (int nThreads) 固定线程池

java 复制代码
// 创建固定数量的核心线程,无临时线程
ExecutorService pool = Executors.newFixedThreadPool(3);
  • 参数:线程数量固定
  • 底层源码:
java 复制代码
new ThreadPoolExecutor(nThreads, nThreads,
        0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<Runnable>());
  • 参数解读:核心线程数 = 最大线程数,没有临时线程 ;阻塞队列LinkedBlockingQueue默认容量Integer.MAX_VALUE(无限队列)
  • 特点:线程数量固定,线程不会被回收;任务多了会无限往队列放。
  • 风险:任务大量堆积,队列无限长 → OOM 内存溢出

2. newSingleThreadExecutor () 单线程池

java 复制代码
ExecutorService pool = Executors.newSingleThreadExecutor();
  • 底层:核心线程 = 1,最大线程 = 1,无限阻塞队列
  • 特点:池内永远只有1 个线程,任务串行依次执行;适合任务需要顺序执行场景。
  • 风险:同样无限队列,任务堆积 OOM。

3. newCachedThreadPool () 可缓存线程池

java 复制代码
ExecutorService pool = Executors.newCachedThreadPool();
  • 底层源码:
java 复制代码
new ThreadPoolExecutor(0, Integer.MAX_VALUE,
        60L, TimeUnit.SECONDS,
        new SynchronousQueue<Runnable>());
  • 参数解读:0 个核心线程 ;最大线程数为Integer.MAX_VALUE;临时线程空闲 60 秒自动销毁;队列SynchronousQueue不存储任务,来了任务直接创建线程。
  • 特点:按需创建线程;线程空闲 60s 自动回收。
  • 风险:任务瞬间大量涌入,会疯狂新建线程,线程数量过多,CPU 耗尽,OOM。

4. newScheduledThreadPool (int corePoolSize) 定时线程池

java 复制代码
// 支持延迟执行、周期性重复执行任务
ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
  • 返回值:ScheduledExecutorService,继承ExecutorService,额外支持定时任务
  • 特点:可以延迟一段时间执行任务,或者每隔一段时间重复执行任务。
  • 风险:最大线程数Integer.MAX_VALUE,大量任务会创建大量线程,OOM。

三、代码示例演示

示例 1:newFixedThreadPool

java 复制代码
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecutorsDemo {
    public static void main(String[] args) {
        // 创建固定3个线程的线程池
        ExecutorService pool = Executors.newFixedThreadPool(3);

        // 提交5个任务
        for (int i = 1; i <= 5; i++) {
            pool.submit(() -> {
                System.out.println(Thread.currentThread().getName() + "正在执行任务");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        // 关闭线程池:不再接收新任务,执行完现有任务再关闭
        pool.shutdown();
    }
}

示例 2:定时线程池(延迟执行)

java 复制代码
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledPoolDemo {
    public static void main(String[] args) {
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
        // 参数:任务,延迟多久执行,时间单位
        pool.schedule(() -> {
            System.out.println("延迟3秒执行");
        },3, TimeUnit.SECONDS);
    }
}

四、ExecutorService 线程池常用方法

方法 作用
execute(Runnable task) 提交无返回值任务
submit(task) 提交任务,支持 Runnable/Callable,返回 Future 对象,可以拿到任务返回结果
shutdown() 平缓关闭线程池,不接收新任务,等待已经提交的任务执行完毕
shutdownNow() 立刻尝试关闭,中断正在运行任务,返回队列里未执行的任务列表
isShutdown() 判断线程池是否已经关闭

五、重点面试总结(必背)

  1. Executors 是什么?

线程池工具类,静态方法快速创建线程池,底层封装 ThreadPoolExecutor。

  1. 为什么生产不推荐 Executors?
  • newFixedThreadPool /newSingleThreadExecutor:阻塞队列是无限长,大量任务堆积 → OOM
  • newCachedThreadPool /newScheduledThreadPool:最大线程数无限,大量任务会创建海量线程 → OOM

✅生产推荐:手动new ThreadPoolExecutor(),自定义 7 个参数,限制队列长度、最大线程数。

  1. 四个线程池简单区分
  • newFixedThreadPool:固定数量线程
  • newSingleThreadExecutor:单线程,串行执行
  • newCachedThreadPool:自动按需创建、回收临时线程
  • newScheduledThreadPool:延迟 / 周期定时任务

六、Executors 和 ThreadPoolExecutor 的关系

  • ThreadPoolExecutor:线程池实现类,原生构造器,7 个参数,可控,生产推荐
  • Executors:工具类,只是帮你 new ThreadPoolExecutor,帮你填好参数,简化代码
  • ExecutorService:线程池接口,定义线程池的行为方法
相关推荐
学长毕设5 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
C^h5 小时前
c++ string
开发语言·c++
raindayinrain5 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的5 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao5 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
zzu123zsw6 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
学逆向的6 小时前
C 局部静态变量
c语言·开发语言·网络安全
大都督会赢的6 小时前
C++第一节课
开发语言·c++
“AI国潮设计-小江”7 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
源码集结号7 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统