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:线程池接口,定义线程池的行为方法
相关推荐
扶风ff41 分钟前
练题簿在线免费刷题:会员线下组卷、Word 试卷与成绩导入,课堂检测更方便
java·开发语言·算法·小程序·word
鱼宵42 分钟前
Spring AI 可观测与透明化:traceId 串起全链路,思考过程实时直播给用户
java·人工智能·spring·链路追踪·springai
程序员老陆1 小时前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++
Zelman1 小时前
第06章-超节点
人工智能·后端
Raas1001 小时前
AI网关能做语义缓存吗?MAI Gateway(魔芋企业级AI网关)实战能力深度解读
java·后端·spring
weixin199701080161 小时前
《1688消息服务落地方案:alibaba.message.* 与 Webhook 回调的可靠性与重试策略》(附Python源码)
开发语言·python
静水深码1 小时前
AI 能翻好谐音梗吗
人工智能·后端
柏修1 小时前
Java工程师转型Agent Engineer - 24周详细学习计划
后端
牛气冲天的星球1 小时前
服务器资源监控之grafana+Prometheus配置
后端