
一、先搞清楚Executors 是什么Executors是 JDK 自带的一个工具类。它提供了 4 个静态方法帮你快速创建线程池newFixedThreadPoolnewSingleThreadExecutornewCachedThreadPoolnewScheduledThreadPool看起来很贴心但全部都有致命缺陷。二、Executors 提供的 4 种线程池到底哪里危险1. newFixedThreadPool —— 固定线程数线程池使用方式ExecutorService pool Executors.newFixedThreadPool(5);它的特点核心线程数 最大线程数固定不变任务队列用的是new LinkedBlockingQueueRunnable()致命问题LinkedBlockingQueue 是无界队列什么叫无界队列→可以无限放任务没有长度上限会发生什么如果请求流量突然暴涨核心线程忙不过来所有任务都塞进队列队列越来越长占满内存最终 OOM内存溢出服务直接崩溃总结FixedThreadPool 用无界队列 → 任务无限堆积 → 内存爆掉。2. newSingleThreadExecutor —— 单线程线程池Executors.newSingleThreadExecutor();问题和 FixedThreadPool 完全一样队列也是无界 LinkedBlockingQueue。只要任务一积压照样 OOM。3. newCachedThreadPool —— 缓存线程池Executors.newCachedThreadPool();特点核心线程数0最大线程数Integer.MAX_VALUE≈ 21 亿队列SynchronousQueue不存任务直接提交致命问题最大线程数无上限会发生什么流量一高来一个任务创建一个线程来一万个任务创建一万个线程来十万个创建十万个线程CPU 直接 100%系统卡死最后 OOM总结CachedThreadPool 可以无限创建线程 → CPU 炸、内存炸、服务炸。4. newScheduledThreadPool —— 定时任务线程池Executors.newScheduledThreadPool(3);问题底层用的是new DelayedWorkQueue()也是无界队列定时任务一旦堆积照样 OOM。三、Executors 的本质问题一句话总结我把 4 个线程池的致命缺陷汇总成 3 句要么无界队列 → 任务堆积 → OOM要么无限线程 → CPU 100% → 系统崩溃没有任何过载保护、没有任何安全兜底Executors 方便是方便但完全不适合生产环境它就是给学习、测试、小 Demo用的玩具。一旦上生产就是定时炸弹。四、那正确的线程池应该怎么创建答案只有一个手动 new ThreadPoolExecutor ()这是阿里强制要求、也是企业生产唯一标准写法。标准代码ThreadPoolExecutor pool new ThreadPoolExecutor( 5, // 核心线程 10, // 最大线程 5L, // 空闲线程存活时间 TimeUnit.SECONDS, // 时间单位 new ArrayBlockingQueue(100), // 有界队列关键 new MyThreadFactory(), // 自定义线程工厂 new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略 );为什么这个安全队列是有界的 ArrayBlockingQueue (100)最多存 100 个任务不会无限堆积。最大线程数是固定的 10不会无限创建线程。有拒绝策略忙不过来就触发拒绝策略保护系统不崩。五、为什么必须手动指定 7 个参数因为你要完全掌控线程池的所有行为核心线程多少最大线程多少队列多长线程叫什么名字忙不过来怎么办全部由你控制而不是交给 JDK 瞎处理。