在 Java 面试中线程池几乎是必问题。很多人只知道“线程池可以复用线程提高性能”但当面试官继续追问“ThreadPoolExecutor 的 7 个核心参数是什么每个参数有什么作用”如果回答不完整很可能直接被判定为基础不扎实。今天这篇文章我们就系统梳理Java线程池的7个参数 原理 实战让你在面试中稳稳拿分。一、问题背景在高并发系统中如果每次任务都创建新线程会带来很多问题创建线程成本高频繁创建/销毁线程影响性能线程过多导致系统资源耗尽线程管理复杂因此 Java 提供了线程池机制。在java.util.concurrent包中核心类是ThreadPoolExecutor很多人只会用Executors.newFixedThreadPool()但在真实生产环境中这种写法并不推荐。阿里Java开发手册明确指出线程池必须手动通过 ThreadPoolExecutor 创建。原因就是需要理解并控制线程池的7个核心参数。二、技术原理解析ThreadPoolExecutor 构造函数public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueueRunnable workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler )也就是说线程池由7个核心参数组成。1 corePoolSize核心线程数核心线程数表示线程池长期保持的线程数量特点即使线程空闲也不会销毁默认一直存在用于处理常规任务例如corePoolSize 5表示线程池至少有5个线程。任务执行流程任务到达 → 创建核心线程执行2 maximumPoolSize最大线程数表示线程池允许创建的最大线程数量。当满足条件时会扩容条件任务数量 核心线程数 且 队列已满这时线程池会创建新线程。例如corePoolSize 5 maximumPoolSize 10表示常驻线程5最大线程103 keepAliveTime线程存活时间表示非核心线程空闲多久后被销毁例如keepAliveTime 60表示非核心线程60秒没任务 → 销毁核心线程默认不会被销毁。如果设置allowCoreThreadTimeOut(true)核心线程也可以回收。4 unit时间单位keepAliveTime 的时间单位常见TimeUnit.SECONDS TimeUnit.MINUTES TimeUnit.MILLISECONDS例如60 SECONDS5 workQueue任务队列当核心线程都在忙时任务会进入队列。常见队列1 LinkedBlockingQueue无界队列特点容量理论无限线程数基本不会超过corePoolSize风险任务堆积 → OOM2 ArrayBlockingQueue有界队列需要指定容量new ArrayBlockingQueue(100)优点防止任务无限堆积3 SynchronousQueue不存储任务。任务必须直接交给线程执行。典型应用CachedThreadPool6 threadFactory线程工厂用于创建线程。例如Executors.defaultThreadFactory()实际生产中经常自定义new ThreadFactoryBuilder() .setNameFormat(order-thread-%d) .build();优点方便日志定位方便监控7 handler拒绝策略当线程数达到最大 队列也满任务会被拒绝。Java提供4种策略。1 AbortPolicy默认直接抛异常RejectedExecutionException2 CallerRunsPolicy让提交任务的线程执行任务优点降低任务提交速度3 DiscardPolicy直接丢弃任务不抛异常。4 DiscardOldestPolicy丢弃队列最旧任务再执行新任务。线程池执行流程面试必考线程池执行任务的完整流程1 任务到达 2 如果线程 corePoolSize 创建核心线程执行 3 如果线程 corePoolSize 进入任务队列 4 如果队列满 创建新线程直到maximumPoolSize 5 如果线程达到maximumPoolSize 执行拒绝策略这是高频面试题。我整理了一套完整Java面试题库完整版在我的技术站。网站地址https://myquotego.com/html/questions?_fromcsdn_159052455_1三、代码示例手动创建线程池ThreadPoolExecutor executor new ThreadPoolExecutor( 5, 10, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(100), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() );提交任务for (int i 0; i 20; i) { executor.execute(() - { System.out.println( Thread.currentThread().getName() 执行任务 ); }); }执行效果core线程优先执行 队列缓存任务 必要时创建新线程四、实际应用场景线程池在企业项目中非常常见。场景1高并发订单处理电商系统用户下单 库存扣减 订单创建 消息发送这些任务可以通过线程池异步处理。优点提高接口响应速度降低系统压力场景2日志异步写入日志系统通常会业务线程 → 提交日志任务 → 线程池处理这样可以避免IO阻塞场景3消息队列消费者例如Kafka RocketMQ RabbitMQ消费消息后可以线程池并发处理提高吞吐量。我整理了一套完整Java面试题库完整版在我的技术站。网站地址https://myquotego.com/html/questions?_fromcsdn_159052455_1如果你准备Java面试 / 架构师面试这些题目基本都会遇到。五、总结最后总结一下Java线程池7个核心参数参数作用corePoolSize核心线程数maximumPoolSize最大线程数keepAliveTime非核心线程存活时间unit时间单位workQueue任务队列threadFactory线程工厂handler拒绝策略线程池执行流程任务 → 核心线程 → 队列 → 最大线程 → 拒绝策略掌握这些知识点在Java面试中基本可以应对绝大多数问题。我整理了一套完整Java面试题库完整版在我的技术站。网站地址https://myquotego.com/html/questions?_fromcsdn_159052455_1如果你正在准备Java面试Java架构师面试高并发系统设计这些核心知识一定要掌握。关注我持续更新Java面试核心知识。