
一、什么是线程池为什么要用线程池1. 基础概念线程池是预先创建一批可复用线程存放在线程池中统一管理当任务提交时直接分配空闲线程执行任务结束线程不销毁放回池内等待下一个任务。 本质缓存复用线程统一管控并发线程资源。2. 不使用线程池的痛点new Thread () 弊端频繁创建、销毁线程操作系统内核切换开销大性能差无限制创建线程CPU 上下文切换暴涨内存耗尽出现 OOM线程无统一管理无法监控、限流、控制并发数量缺少统一拒绝、超时、任务排队机制。3. 线程池四大核心优势降低资源消耗线程复用减少创建销毁开销提升响应速度任务到达无需新建线程直接执行可控并发数量限制最大线程数保护服务器 CPU、内存统一管理支持任务队列、拒绝策略、监控、定时、延时任务。二、线程池七大核心参数ThreadPoolExecutor构造方法完整 7 个参数面试必背public ThreadPoolExecutor( int corePoolSize, // 1.核心线程数 int maximumPoolSize, // 2.最大线程数 long keepAliveTime, // 3.非核心线程空闲存活时间 TimeUnit unit, // 4.时间单位 BlockingQueueRunnable workQueue, // 5.阻塞任务队列 ThreadFactory threadFactory, // 6.线程工厂创建线程 RejectedExecutionHandler handler // 7.拒绝策略 )逐个解释corePoolSize 核心线程数常驻线程默认不会回收即使空闲也保留在线程池随时处理任务。maximumPoolSize 最大线程数线程池能容纳总线程上限 最大线程 核心线程 临时非核心线程keepAliveTime 空闲存活时间只针对非核心线程空闲超过该时长临时线程会被回收核心线程默认不回收可通过 allowCoreThreadTimeOut 开启回收。unit 时间单位秒、毫秒、分钟等。workQueue 阻塞队列存放等待执行的任务核心线程全部忙碌时新任务进入队列排队。 常用队列ArrayBlockingQueue有界队列必须指定长度LinkedBlockingQueue无界 / 有界不设长度会无限存任务OOM 风险SynchronousQueue不存储元素插入任务必须立刻有线程执行。threadFactory 线程工厂自定义线程名称、是否守护线程方便日志排查。handler 拒绝策略线程达到 max、队列也满了无法处理新任务时执行的兜底策略。三、任务提交完整执行流程重中之重假设核心 5最大 10队列容量 20提交任务判断当前运行线程数 corePoolSize→ 新建核心线程执行任务核心线程已满判断阻塞队列是否未满→ 任务放入队列排队队列塞满判断当前线程 maximumPoolSize→ 创建临时非核心线程执行任务线程总数已达 maximumPoolSize队列也满 → 触发拒绝策略处理新任务。流程图简记核心线程 → 队列 → 临时线程 → 拒绝策略四、四种内置拒绝策略 RejectedExecutionHandlerAbortPolicy默认直接抛出 RejectedExecutionException阻断程序适合需要感知失败的业务。DiscardPolicy默默丢弃当前新任务无异常数据丢失风险极少使用。DiscardOldestPolicy丢弃队列中等待最久的任务再尝试提交当前新任务。CallerRunsPolicy不新开线程由提交任务的主线程自己执行任务起到限流作用减缓任务提交速度。五、JDK 提供四种快捷线程池Executors 工具类阿里开发规范禁止生产直接使用底层均存在无界队列导致 OOM 问题只适合测试。newFixedThreadPool(n)固定线程池coremaxn无临时线程队列 LinkedBlockingQueue 无界任务无限堆积 OOM。newSingleThreadExecutor()单线程池只有 1 个核心线程串行执行所有任务无界队列。newCachedThreadPool()缓存线程池core0maxInteger.MAX_VALUESynchronousQueue任务多会疯狂创建线程OOM。newScheduledThreadPool()定时延时任务线程池支持 schedule 定时、周期执行任务。生产规范手动 new ThreadPoolExecutor自定义有界队列、合理最大线程、自定义拒绝策略。六、线程池两种状态核心线程回收特性默认核心线程永久保留空闲不会销毁开启allowCoreThreadTimeOut(true)核心线程空闲超时后同样回收。七、线程池关闭两种方法shutdown () 不再接收新任务等待队列已有任务全部执行完成后销毁线程温和关闭。shutdownNow () 立刻中断所有正在执行线程清空队列返回未执行任务列表强制关闭。八、核心设计思想总结分层处理任务先复用常驻核心线程减少创建开销队列削峰突发流量放入队列缓冲避免瞬间创建大量线程临时线程扩容队列饱和后短期扩容应对峰值拒绝策略兜底防止无限创建线程压垮服务提供限流保障。九、优缺点总结优点线程复用减少频繁创建销毁的 CPU 开销响应快任务到达无需新建线程并发可控限制最大线程保护服务支持队列缓冲、定时任务、失败拒绝、监控。缺点线程池参数设置不合理会引发问题core/max 过小任务大量排队响应缓慢队列无界任务堆积内存溢出拒绝策略选择不当丢失业务数据简单短时任务场景会有轻微线程调度损耗。十、精简口述总结线程池是复用、统一管理线程的容器解决频繁创建销毁线程的性能问题核心七大参数控制核心线程、最大线程、等待队列、拒绝策略任务执行顺序优先核心线程再队列再临时线程资源打满触发拒绝策略生产环境禁止 Executors 快捷创建手动指定有界队列和合理线程参数实现并发限流保护服务。