连载中 14/21

线程池(上):七大参数与一个任务的完整旅程

2026-10-29 · 24 阅读 · 0 评论 · 0 赞

先看大厂规范为什么禁止 Executors

阿里开发规范明令:线程池必须手动 new ThreadPoolExecutor,禁止用 Executors 工厂方法。原因就两个坑:newFixedThreadPool 的队列是无界 LinkedBlockingQueue——任务只进不出,内存涨到 OOM;newCachedThreadPool 的 maximumPoolSize 是 Integer.MAX_VALUE——来多少任务开多少线程,线程涨到 OOM。一个炸堆内存,一个炸线程数,都不是玄学,是边界参数没守住。

手动创建:七大参数逐个点名

ThreadPoolExecutor executor = new ThreadPoolExecutor(
        4,                                         // corePoolSize:常驻核心线程数
        8,                                         // maximumPoolSize:线程数天花板
        60, TimeUnit.SECONDS,                      // keepAliveTime:闲线程存活时间
        new ArrayBlockingQueue<>(100),             // workQueue:排队的队列
        new NamedThreadFactory("order-pool"),      // threadFactory:线程工厂
        new ThreadPoolExecutor.CallerRunsPolicy()  // handler:拒绝策略
);

前四个管「人」:核心线程是常驻编制;忙不过来时先扩到天花板;闲下来按 keepAliveTime 裁掉多余线程(核心线程默认不裁,allowCoreThreadTimeOut 可改)。后三个管「事」:队列排队、工厂造线程、拒绝策略兜底。线程工厂最容易被忽视却最影响排障——不给线程起名,jstack 里全是 pool-1-thread-N,出事时谁是谁根本分不清。

一个任务的完整旅程

提交一个任务后,线程池按固定顺序判定,很多人记反,务必记牢:

提交任务
  → 核心线程未满?      建核心线程执行
  → 队列没满?          入队排队
  → 线程数未到天花板?  建非核心线程救急
  → 都满了              触发拒绝策略

注意顺序:队列先于非核心线程——线程池宁可让任务排队,也不轻易扩编制。这解释了一个反直觉现象:配无界队列时,maximumPoolSize 和 keepAliveTime 永远不生效,因为队列永远不满,非核心线程永远轮不到创建。参数之间是联动的,不是各管各的。

submit 的陷阱:吞异常

submit 比 execute 多包一层 Future:能拿结果,但任务抛的异常也藏进了 Future 里——不主动 get 就永远没人知道,日志和监控统统看不见。多少「线程池任务静默失败」的事故,根子都在这。生产代码要么统一处理 Future 的异常,要么干脆用 execute 配合 ThreadFactory 里设置 UncaughtExceptionHandler。

参数怎么定才不是拍脑袋?四种拒绝策略各适合什么?怎么不重启就调参?下一篇全部给出答案。

☕
503

10 年全栈工程师 · 503咖啡馆主理人

#Java#线程池#ThreadPoolExecutor#JUC#并发编程

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10113 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9876 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9306 阅读 · 21 评论 · 287 赞