线程池核心参数与调优策略

线程池核心参数与调优策略

线程池是并发编程的核心基础设施,本文深入解析线程池的参数配置、状态流转与性能调优。


一、线程池核心参数详解

1.1 线程池构造函数的七个参数

ThreadPoolExecutor 的构造函数有七个核心参数,这些参数共同决定了线程池的行为和性能特征。

java 复制代码
public ThreadPoolExecutor(
    int corePoolSize,                      // 核心线程数
    int maximumPoolSize,                   // 最大线程数
    long keepAliveTime,                    // 空闲线程存活时间
    TimeUnit unit,                         // 存活时间单位
    BlockingQueue<Runnable> workQueue,     // 任务队列
    ThreadFactory threadFactory,           // 线程工厂
    RejectedExecutionHandler handler       // 拒绝策略
)
七参数架构图

#mermaid-svg-u3wNQBc5nyayp1Y9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-u3wNQBc5nyayp1Y9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-u3wNQBc5nyayp1Y9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-u3wNQBc5nyayp1Y9 .error-icon{fill:#552222;}#mermaid-svg-u3wNQBc5nyayp1Y9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-u3wNQBc5nyayp1Y9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-u3wNQBc5nyayp1Y9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-u3wNQBc5nyayp1Y9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-u3wNQBc5nyayp1Y9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-u3wNQBc5nyayp1Y9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-u3wNQBc5nyayp1Y9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-u3wNQBc5nyayp1Y9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-u3wNQBc5nyayp1Y9 .marker.cross{stroke:#333333;}#mermaid-svg-u3wNQBc5nyayp1Y9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-u3wNQBc5nyayp1Y9 p{margin:0;}#mermaid-svg-u3wNQBc5nyayp1Y9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-u3wNQBc5nyayp1Y9 .cluster-label text{fill:#333;}#mermaid-svg-u3wNQBc5nyayp1Y9 .cluster-label span{color:#333;}#mermaid-svg-u3wNQBc5nyayp1Y9 .cluster-label span p{background-color:transparent;}#mermaid-svg-u3wNQBc5nyayp1Y9 .label text,#mermaid-svg-u3wNQBc5nyayp1Y9 span{fill:#333;color:#333;}#mermaid-svg-u3wNQBc5nyayp1Y9 .node rect,#mermaid-svg-u3wNQBc5nyayp1Y9 .node circle,#mermaid-svg-u3wNQBc5nyayp1Y9 .node ellipse,#mermaid-svg-u3wNQBc5nyayp1Y9 .node polygon,#mermaid-svg-u3wNQBc5nyayp1Y9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-u3wNQBc5nyayp1Y9 .rough-node .label text,#mermaid-svg-u3wNQBc5nyayp1Y9 .node .label text,#mermaid-svg-u3wNQBc5nyayp1Y9 .image-shape .label,#mermaid-svg-u3wNQBc5nyayp1Y9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-u3wNQBc5nyayp1Y9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-u3wNQBc5nyayp1Y9 .rough-node .label,#mermaid-svg-u3wNQBc5nyayp1Y9 .node .label,#mermaid-svg-u3wNQBc5nyayp1Y9 .image-shape .label,#mermaid-svg-u3wNQBc5nyayp1Y9 .icon-shape .label{text-align:center;}#mermaid-svg-u3wNQBc5nyayp1Y9 .node.clickable{cursor:pointer;}#mermaid-svg-u3wNQBc5nyayp1Y9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-u3wNQBc5nyayp1Y9 .arrowheadPath{fill:#333333;}#mermaid-svg-u3wNQBc5nyayp1Y9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-u3wNQBc5nyayp1Y9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-u3wNQBc5nyayp1Y9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-u3wNQBc5nyayp1Y9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-u3wNQBc5nyayp1Y9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-u3wNQBc5nyayp1Y9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-u3wNQBc5nyayp1Y9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-u3wNQBc5nyayp1Y9 .cluster text{fill:#333;}#mermaid-svg-u3wNQBc5nyayp1Y9 .cluster span{color:#333;}#mermaid-svg-u3wNQBc5nyayp1Y9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-u3wNQBc5nyayp1Y9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-u3wNQBc5nyayp1Y9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-u3wNQBc5nyayp1Y9 .icon-shape,#mermaid-svg-u3wNQBc5nyayp1Y9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-u3wNQBc5nyayp1Y9 .icon-shape p,#mermaid-svg-u3wNQBc5nyayp1Y9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-u3wNQBc5nyayp1Y9 .icon-shape .label rect,#mermaid-svg-u3wNQBc5nyayp1Y9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-u3wNQBc5nyayp1Y9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-u3wNQBc5nyayp1Y9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-u3wNQBc5nyayp1Y9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ThreadPoolExecutor 构造函数
corePoolSize

核心线程数
maximumPoolSize

最大线程数
keepAliveTime

空闲存活时间
unit

时间单位
workQueue

任务队列
threadFactory

线程工厂
handler

拒绝策略
线程池保底线程数
空闲不被回收
最大可创建线程数
队列满时触发扩容
非核心线程超时回收
allowCoreThreadTimeOut

可回收核心线程
LinkedBlockingQueue

无界队列
ArrayBlockingQueue

有界队列
SynchronousQueue

同步队列
PriorityBlockingQueue

优先级队列
AbortPolicy

抛异常
CallerRunsPolicy

调用者执行
DiscardPolicy

静默丢弃
DiscardOldestPolicy

丢弃最老

  • corePoolSize(核心线程数) :线程池中保持的最小线程数量,即使这些线程处于空闲状态也不会被回收。只有当 allowCoreThreadTimeOut 设置为 true 时,核心线程才会被回收。
  • maximumPoolSize(最大线程数):线程池允许创建的最大线程数量。当任务队列满时,线程池会创建新线程直到达到这个上限。
  • keepAliveTime(空闲线程存活时间):非核心线程在空闲状态下保持存活的时间。当线程数量超过 corePoolSize 时,多余的空闲线程会在这个时间后被终止。
  • unit(时间单位):keepAliveTime 的时间单位,可以是纳秒、毫秒、秒、分钟等。
  • workQueue(任务队列):用于保存待执行任务的阻塞队列。常用的队列类型包括:LinkedBlockingQueue(无界队列)、ArrayBlockingQueue(有界队列)、SynchronousQueue(同步队列)、PriorityBlockingQueue(优先级队列)。
  • threadFactory(线程工厂):用于创建新线程的工厂,可以自定义线程的名称、优先级、守护线程属性等。
  • handler(拒绝策略):当任务队列和线程池都满了时的拒绝策略。JDK 提供了四种默认策略:AbortPolicy(抛异常)、CallerRunsPolicy(调用者执行)、DiscardPolicy(丢弃任务)、DiscardOldestPolicy(丢弃最老任务)。

1.2 线程池的工作流程

线程池的处理流程遵循以下规则:当提交一个新任务时,如果线程池中的线程数小于 corePoolSize,会创建新线程执行任务;如果线程数等于或大于 corePoolSize,会尝试将任务放入队列;如果队列满且线程数小于 maximumPoolSize,会创建新线程执行任务;如果线程数达到 maximumPoolSize,执行拒绝策略。
#mermaid-svg-tiar9nRaUD96WoNv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tiar9nRaUD96WoNv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tiar9nRaUD96WoNv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tiar9nRaUD96WoNv .error-icon{fill:#552222;}#mermaid-svg-tiar9nRaUD96WoNv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tiar9nRaUD96WoNv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tiar9nRaUD96WoNv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tiar9nRaUD96WoNv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tiar9nRaUD96WoNv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tiar9nRaUD96WoNv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tiar9nRaUD96WoNv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tiar9nRaUD96WoNv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tiar9nRaUD96WoNv .marker.cross{stroke:#333333;}#mermaid-svg-tiar9nRaUD96WoNv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tiar9nRaUD96WoNv p{margin:0;}#mermaid-svg-tiar9nRaUD96WoNv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tiar9nRaUD96WoNv .cluster-label text{fill:#333;}#mermaid-svg-tiar9nRaUD96WoNv .cluster-label span{color:#333;}#mermaid-svg-tiar9nRaUD96WoNv .cluster-label span p{background-color:transparent;}#mermaid-svg-tiar9nRaUD96WoNv .label text,#mermaid-svg-tiar9nRaUD96WoNv span{fill:#333;color:#333;}#mermaid-svg-tiar9nRaUD96WoNv .node rect,#mermaid-svg-tiar9nRaUD96WoNv .node circle,#mermaid-svg-tiar9nRaUD96WoNv .node ellipse,#mermaid-svg-tiar9nRaUD96WoNv .node polygon,#mermaid-svg-tiar9nRaUD96WoNv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tiar9nRaUD96WoNv .rough-node .label text,#mermaid-svg-tiar9nRaUD96WoNv .node .label text,#mermaid-svg-tiar9nRaUD96WoNv .image-shape .label,#mermaid-svg-tiar9nRaUD96WoNv .icon-shape .label{text-anchor:middle;}#mermaid-svg-tiar9nRaUD96WoNv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tiar9nRaUD96WoNv .rough-node .label,#mermaid-svg-tiar9nRaUD96WoNv .node .label,#mermaid-svg-tiar9nRaUD96WoNv .image-shape .label,#mermaid-svg-tiar9nRaUD96WoNv .icon-shape .label{text-align:center;}#mermaid-svg-tiar9nRaUD96WoNv .node.clickable{cursor:pointer;}#mermaid-svg-tiar9nRaUD96WoNv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tiar9nRaUD96WoNv .arrowheadPath{fill:#333333;}#mermaid-svg-tiar9nRaUD96WoNv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tiar9nRaUD96WoNv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tiar9nRaUD96WoNv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tiar9nRaUD96WoNv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tiar9nRaUD96WoNv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tiar9nRaUD96WoNv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tiar9nRaUD96WoNv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tiar9nRaUD96WoNv .cluster text{fill:#333;}#mermaid-svg-tiar9nRaUD96WoNv .cluster span{color:#333;}#mermaid-svg-tiar9nRaUD96WoNv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tiar9nRaUD96WoNv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tiar9nRaUD96WoNv rect.text{fill:none;stroke-width:0;}#mermaid-svg-tiar9nRaUD96WoNv .icon-shape,#mermaid-svg-tiar9nRaUD96WoNv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tiar9nRaUD96WoNv .icon-shape p,#mermaid-svg-tiar9nRaUD96WoNv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tiar9nRaUD96WoNv .icon-shape .label rect,#mermaid-svg-tiar9nRaUD96WoNv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tiar9nRaUD96WoNv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tiar9nRaUD96WoNv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tiar9nRaUD96WoNv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是





提交任务
线程数 < corePoolSize?
创建新线程

执行任务
尝试加入任务队列
队列已满?
加入队列

等待执行
线程数 < maximumPoolSize?
创建新线程

执行任务
执行拒绝策略


1.3 队列类型的选择

不同类型的任务队列适用于不同的业务场景,选择合适的队列类型是线程池调优的重要一环。
#mermaid-svg-SP0HzgEmf4L1EAa7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SP0HzgEmf4L1EAa7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SP0HzgEmf4L1EAa7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SP0HzgEmf4L1EAa7 .error-icon{fill:#552222;}#mermaid-svg-SP0HzgEmf4L1EAa7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SP0HzgEmf4L1EAa7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SP0HzgEmf4L1EAa7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SP0HzgEmf4L1EAa7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SP0HzgEmf4L1EAa7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SP0HzgEmf4L1EAa7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SP0HzgEmf4L1EAa7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SP0HzgEmf4L1EAa7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SP0HzgEmf4L1EAa7 .marker.cross{stroke:#333333;}#mermaid-svg-SP0HzgEmf4L1EAa7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SP0HzgEmf4L1EAa7 p{margin:0;}#mermaid-svg-SP0HzgEmf4L1EAa7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SP0HzgEmf4L1EAa7 .cluster-label text{fill:#333;}#mermaid-svg-SP0HzgEmf4L1EAa7 .cluster-label span{color:#333;}#mermaid-svg-SP0HzgEmf4L1EAa7 .cluster-label span p{background-color:transparent;}#mermaid-svg-SP0HzgEmf4L1EAa7 .label text,#mermaid-svg-SP0HzgEmf4L1EAa7 span{fill:#333;color:#333;}#mermaid-svg-SP0HzgEmf4L1EAa7 .node rect,#mermaid-svg-SP0HzgEmf4L1EAa7 .node circle,#mermaid-svg-SP0HzgEmf4L1EAa7 .node ellipse,#mermaid-svg-SP0HzgEmf4L1EAa7 .node polygon,#mermaid-svg-SP0HzgEmf4L1EAa7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SP0HzgEmf4L1EAa7 .rough-node .label text,#mermaid-svg-SP0HzgEmf4L1EAa7 .node .label text,#mermaid-svg-SP0HzgEmf4L1EAa7 .image-shape .label,#mermaid-svg-SP0HzgEmf4L1EAa7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-SP0HzgEmf4L1EAa7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SP0HzgEmf4L1EAa7 .rough-node .label,#mermaid-svg-SP0HzgEmf4L1EAa7 .node .label,#mermaid-svg-SP0HzgEmf4L1EAa7 .image-shape .label,#mermaid-svg-SP0HzgEmf4L1EAa7 .icon-shape .label{text-align:center;}#mermaid-svg-SP0HzgEmf4L1EAa7 .node.clickable{cursor:pointer;}#mermaid-svg-SP0HzgEmf4L1EAa7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SP0HzgEmf4L1EAa7 .arrowheadPath{fill:#333333;}#mermaid-svg-SP0HzgEmf4L1EAa7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SP0HzgEmf4L1EAa7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SP0HzgEmf4L1EAa7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SP0HzgEmf4L1EAa7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SP0HzgEmf4L1EAa7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SP0HzgEmf4L1EAa7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SP0HzgEmf4L1EAa7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SP0HzgEmf4L1EAa7 .cluster text{fill:#333;}#mermaid-svg-SP0HzgEmf4L1EAa7 .cluster span{color:#333;}#mermaid-svg-SP0HzgEmf4L1EAa7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SP0HzgEmf4L1EAa7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SP0HzgEmf4L1EAa7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-SP0HzgEmf4L1EAa7 .icon-shape,#mermaid-svg-SP0HzgEmf4L1EAa7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SP0HzgEmf4L1EAa7 .icon-shape p,#mermaid-svg-SP0HzgEmf4L1EAa7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SP0HzgEmf4L1EAa7 .icon-shape .label rect,#mermaid-svg-SP0HzgEmf4L1EAa7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SP0HzgEmf4L1EAa7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SP0HzgEmf4L1EAa7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SP0HzgEmf4L1EAa7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 优先级队列
PriorityBlockingQueue
按优先级出队
需实现 Comparator
同步队列
SynchronousQueue
容量为 0
任务直接交付给线程
适合最大吞吐量场景
有界队列
ArrayBlockingQueue
固定容量
适合任务量可控
需配合核心/最大线程数调优
无界队列
LinkedBlockingQueue
容量 Integer.MAX_VALUE
适合任务量不可预估
风险: OOM 内存溢出

java 复制代码
// 无界队列:适合任务量不可预估的场景
// 风险:可能导致内存溢出
ExecutorService fixedPool = new ThreadPoolExecutor(
    2, 4, 60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>()
);

// 有界队列:适合任务量可控的场景
// 需要结合 corePoolSize 和 maximumPoolSize 进行调优
ExecutorService boundedPool = new ThreadPoolExecutor(
    2, 4, 60L, TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(100)
);

// 同步队列:不存储任务,直接交付
// 适合需要最大吞吐量的场景
ExecutorService directPool = new ThreadPoolExecutor(
    2, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
    new SynchronousQueue<>()
);

二、线程池状态管理

2.1 线程池的五种状态

线程池通过 AtomicInteger 类型的 ctl 变量存储线程池状态和工作线程数。高三位表示状态,低 29 位表示工作线程数。
#mermaid-svg-ydKeWrfrnjLbE4in{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ydKeWrfrnjLbE4in .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ydKeWrfrnjLbE4in .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ydKeWrfrnjLbE4in .error-icon{fill:#552222;}#mermaid-svg-ydKeWrfrnjLbE4in .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ydKeWrfrnjLbE4in .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ydKeWrfrnjLbE4in .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ydKeWrfrnjLbE4in .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ydKeWrfrnjLbE4in .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ydKeWrfrnjLbE4in .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ydKeWrfrnjLbE4in .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ydKeWrfrnjLbE4in .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ydKeWrfrnjLbE4in .marker.cross{stroke:#333333;}#mermaid-svg-ydKeWrfrnjLbE4in svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ydKeWrfrnjLbE4in p{margin:0;}#mermaid-svg-ydKeWrfrnjLbE4in .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ydKeWrfrnjLbE4in .cluster-label text{fill:#333;}#mermaid-svg-ydKeWrfrnjLbE4in .cluster-label span{color:#333;}#mermaid-svg-ydKeWrfrnjLbE4in .cluster-label span p{background-color:transparent;}#mermaid-svg-ydKeWrfrnjLbE4in .label text,#mermaid-svg-ydKeWrfrnjLbE4in span{fill:#333;color:#333;}#mermaid-svg-ydKeWrfrnjLbE4in .node rect,#mermaid-svg-ydKeWrfrnjLbE4in .node circle,#mermaid-svg-ydKeWrfrnjLbE4in .node ellipse,#mermaid-svg-ydKeWrfrnjLbE4in .node polygon,#mermaid-svg-ydKeWrfrnjLbE4in .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ydKeWrfrnjLbE4in .rough-node .label text,#mermaid-svg-ydKeWrfrnjLbE4in .node .label text,#mermaid-svg-ydKeWrfrnjLbE4in .image-shape .label,#mermaid-svg-ydKeWrfrnjLbE4in .icon-shape .label{text-anchor:middle;}#mermaid-svg-ydKeWrfrnjLbE4in .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ydKeWrfrnjLbE4in .rough-node .label,#mermaid-svg-ydKeWrfrnjLbE4in .node .label,#mermaid-svg-ydKeWrfrnjLbE4in .image-shape .label,#mermaid-svg-ydKeWrfrnjLbE4in .icon-shape .label{text-align:center;}#mermaid-svg-ydKeWrfrnjLbE4in .node.clickable{cursor:pointer;}#mermaid-svg-ydKeWrfrnjLbE4in .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ydKeWrfrnjLbE4in .arrowheadPath{fill:#333333;}#mermaid-svg-ydKeWrfrnjLbE4in .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ydKeWrfrnjLbE4in .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ydKeWrfrnjLbE4in .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ydKeWrfrnjLbE4in .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ydKeWrfrnjLbE4in .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ydKeWrfrnjLbE4in .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ydKeWrfrnjLbE4in .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ydKeWrfrnjLbE4in .cluster text{fill:#333;}#mermaid-svg-ydKeWrfrnjLbE4in .cluster span{color:#333;}#mermaid-svg-ydKeWrfrnjLbE4in div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ydKeWrfrnjLbE4in .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ydKeWrfrnjLbE4in rect.text{fill:none;stroke-width:0;}#mermaid-svg-ydKeWrfrnjLbE4in .icon-shape,#mermaid-svg-ydKeWrfrnjLbE4in .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ydKeWrfrnjLbE4in .icon-shape p,#mermaid-svg-ydKeWrfrnjLbE4in .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ydKeWrfrnjLbE4in .icon-shape .label rect,#mermaid-svg-ydKeWrfrnjLbE4in .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ydKeWrfrnjLbE4in .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ydKeWrfrnjLbE4in .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ydKeWrfrnjLbE4in :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 状态枚举
RUNNING = -1 << COUNT_BITS

接受新任务,处理队列任务
SHUTDOWN = 0 << COUNT_BITS

不接受新任务,处理队列任务
STOP = 1 << COUNT_BITS

不接受新任务,不处理队列任务
TIDYING = 2 << COUNT_BITS

任务已结束,workerCount 为 0
TERMINATED = 3 << COUNT_BITS

terminated() 执行完成
ctl 变量结构
高 3 位: 线程池状态

低 29 位: workerCount

java 复制代码
// ctl 变量存储状态和线程数
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

// 五种状态
private static final int RUNNING    = -1 << COUNT_BITS; // 接受新任务,处理队列任务
private static final int SHUTDOWN   =  0 << COUNT_BITS; // 不接受新任务,但处理队列任务
private static final int STOP       =  1 << COUNT_BITS; // 不接受新任务,不处理队列任务
private static final int TIDYING    =  2 << COUNT_BITS; // 任务已结束,workerCount 为 0
private static final int TERMINATED =  3 << COUNT_BITS; // terminated() 方法执行完成

2.2 状态转换流程

#mermaid-svg-J9vvCDaEtmKsV6Ti{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-J9vvCDaEtmKsV6Ti .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-J9vvCDaEtmKsV6Ti .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-J9vvCDaEtmKsV6Ti .error-icon{fill:#552222;}#mermaid-svg-J9vvCDaEtmKsV6Ti .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-J9vvCDaEtmKsV6Ti .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-J9vvCDaEtmKsV6Ti .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-J9vvCDaEtmKsV6Ti .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-J9vvCDaEtmKsV6Ti .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-J9vvCDaEtmKsV6Ti .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-J9vvCDaEtmKsV6Ti .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-J9vvCDaEtmKsV6Ti .marker{fill:#333333;stroke:#333333;}#mermaid-svg-J9vvCDaEtmKsV6Ti .marker.cross{stroke:#333333;}#mermaid-svg-J9vvCDaEtmKsV6Ti svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-J9vvCDaEtmKsV6Ti p{margin:0;}#mermaid-svg-J9vvCDaEtmKsV6Ti defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-J9vvCDaEtmKsV6Ti g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-J9vvCDaEtmKsV6Ti g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-J9vvCDaEtmKsV6Ti g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-J9vvCDaEtmKsV6Ti g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-J9vvCDaEtmKsV6Ti g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-J9vvCDaEtmKsV6Ti .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-J9vvCDaEtmKsV6Ti .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-J9vvCDaEtmKsV6Ti .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-J9vvCDaEtmKsV6Ti .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-J9vvCDaEtmKsV6Ti .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-J9vvCDaEtmKsV6Ti .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-J9vvCDaEtmKsV6Ti .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-J9vvCDaEtmKsV6Ti .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-J9vvCDaEtmKsV6Ti .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-J9vvCDaEtmKsV6Ti .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-J9vvCDaEtmKsV6Ti .edgeLabel .label text{fill:#333;}#mermaid-svg-J9vvCDaEtmKsV6Ti .label div .edgeLabel{color:#333;}#mermaid-svg-J9vvCDaEtmKsV6Ti .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-J9vvCDaEtmKsV6Ti .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-J9vvCDaEtmKsV6Ti .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-J9vvCDaEtmKsV6Ti .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-J9vvCDaEtmKsV6Ti .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-J9vvCDaEtmKsV6Ti .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-J9vvCDaEtmKsV6Ti .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-J9vvCDaEtmKsV6Ti #statediagram-barbEnd{fill:#333333;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-J9vvCDaEtmKsV6Ti .cluster-label,#mermaid-svg-J9vvCDaEtmKsV6Ti .nodeLabel{color:#131300;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-J9vvCDaEtmKsV6Ti .note-edge{stroke-dasharray:5;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-note text{fill:black;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram-note .nodeLabel{color:black;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagram .edgeLabel{color:red;}#mermaid-svg-J9vvCDaEtmKsV6Ti #dependencyStart,#mermaid-svg-J9vvCDaEtmKsV6Ti #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-J9vvCDaEtmKsV6Ti .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-J9vvCDaEtmKsV6Ti :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 新建线程池
shutdown()
shutdownNow()
队列为空 && workerCount == 0
workerCount == 0
terminated() 执行完成
RUNNING
SHUTDOWN
STOP
TIDYING
TERMINATED
接受新任务

处理队列任务
不接受新任务

继续处理队列任务
不接受新任务

不处理队列任务
所有任务已结束
终结状态

2.3 状态控制方法

java 复制代码
// 优雅关闭线程池
public void shutdownGracefully(ExecutorService pool) {
    pool.shutdown();
    try {
        if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
            pool.shutdownNow();
            if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
                System.err.println("线程池未正常关闭");
            }
        }
    } catch (InterruptedException e) {
        pool.shutdownNow();
        Thread.currentThread().interrupt();
    }
}

三、线程池调优策略

3.1 任务特性分析

调优线程池之前,需要分析任务的特性:CPU 密集型任务、IO 密集型任务、混合型任务。
#mermaid-svg-WAg7NohaOdprYEmL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WAg7NohaOdprYEmL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WAg7NohaOdprYEmL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WAg7NohaOdprYEmL .error-icon{fill:#552222;}#mermaid-svg-WAg7NohaOdprYEmL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WAg7NohaOdprYEmL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WAg7NohaOdprYEmL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WAg7NohaOdprYEmL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WAg7NohaOdprYEmL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WAg7NohaOdprYEmL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WAg7NohaOdprYEmL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WAg7NohaOdprYEmL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WAg7NohaOdprYEmL .marker.cross{stroke:#333333;}#mermaid-svg-WAg7NohaOdprYEmL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WAg7NohaOdprYEmL p{margin:0;}#mermaid-svg-WAg7NohaOdprYEmL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WAg7NohaOdprYEmL .cluster-label text{fill:#333;}#mermaid-svg-WAg7NohaOdprYEmL .cluster-label span{color:#333;}#mermaid-svg-WAg7NohaOdprYEmL .cluster-label span p{background-color:transparent;}#mermaid-svg-WAg7NohaOdprYEmL .label text,#mermaid-svg-WAg7NohaOdprYEmL span{fill:#333;color:#333;}#mermaid-svg-WAg7NohaOdprYEmL .node rect,#mermaid-svg-WAg7NohaOdprYEmL .node circle,#mermaid-svg-WAg7NohaOdprYEmL .node ellipse,#mermaid-svg-WAg7NohaOdprYEmL .node polygon,#mermaid-svg-WAg7NohaOdprYEmL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WAg7NohaOdprYEmL .rough-node .label text,#mermaid-svg-WAg7NohaOdprYEmL .node .label text,#mermaid-svg-WAg7NohaOdprYEmL .image-shape .label,#mermaid-svg-WAg7NohaOdprYEmL .icon-shape .label{text-anchor:middle;}#mermaid-svg-WAg7NohaOdprYEmL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WAg7NohaOdprYEmL .rough-node .label,#mermaid-svg-WAg7NohaOdprYEmL .node .label,#mermaid-svg-WAg7NohaOdprYEmL .image-shape .label,#mermaid-svg-WAg7NohaOdprYEmL .icon-shape .label{text-align:center;}#mermaid-svg-WAg7NohaOdprYEmL .node.clickable{cursor:pointer;}#mermaid-svg-WAg7NohaOdprYEmL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WAg7NohaOdprYEmL .arrowheadPath{fill:#333333;}#mermaid-svg-WAg7NohaOdprYEmL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WAg7NohaOdprYEmL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WAg7NohaOdprYEmL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WAg7NohaOdprYEmL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WAg7NohaOdprYEmL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WAg7NohaOdprYEmL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WAg7NohaOdprYEmL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WAg7NohaOdprYEmL .cluster text{fill:#333;}#mermaid-svg-WAg7NohaOdprYEmL .cluster span{color:#333;}#mermaid-svg-WAg7NohaOdprYEmL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WAg7NohaOdprYEmL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WAg7NohaOdprYEmL rect.text{fill:none;stroke-width:0;}#mermaid-svg-WAg7NohaOdprYEmL .icon-shape,#mermaid-svg-WAg7NohaOdprYEmL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WAg7NohaOdprYEmL .icon-shape p,#mermaid-svg-WAg7NohaOdprYEmL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WAg7NohaOdprYEmL .icon-shape .label rect,#mermaid-svg-WAg7NohaOdprYEmL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WAg7NohaOdprYEmL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WAg7NohaOdprYEmL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WAg7NohaOdprYEmL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CPU 密集型
IO 密集型
混合型
分析任务类型
任务属于哪种类型?
计算为主

CPU 使用率高
线程数 = CPU 核心数 + 1
原因:少量线程因缓存失效等阻塞
等待 IO 为主

CPU 空闲多
线程数 = CPU 核心数 × 2
原因:IO 等待时切换其他任务
既有计算又有 IO
线程数 = 压测确定最优值
使用参数化配置

动态调整

java 复制代码
// CPU 密集型任务:计算为主,线程数 = CPU 核心数 + 1
// 原因:即使 CPU 核心全部用于计算,也会有少量线程因缓存失效等导致阻塞
int cpuCores = Runtime.getRuntime().availableProcessors();
ExecutorService cpuPool = new ThreadPoolExecutor(
    cpuCores,
    cpuCores + 1,
    0L, TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<>(1000)
);

// IO 密集型任务:等待 IO 为主,线程数 = CPU 核心数 * 2
// 原因:IO 操作期间 CPU 空闲,可以调度更多线程
ExecutorService ioPool = new ThreadPoolExecutor(
    cpuCores * 2,
    cpuCores * 2,
    60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(1000)
);

// 混合型任务:根据实际情况调整
// 可以使用参数化配置,通过压测确定最优线程数

3.2 队列容量设置

队列容量的设置需要平衡内存使用和任务拒绝率。过大的队列会消耗大量内存,过小的队列会频繁触发拒绝策略。
#mermaid-svg-nDhB7YiGceFA6CeD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nDhB7YiGceFA6CeD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nDhB7YiGceFA6CeD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nDhB7YiGceFA6CeD .error-icon{fill:#552222;}#mermaid-svg-nDhB7YiGceFA6CeD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nDhB7YiGceFA6CeD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nDhB7YiGceFA6CeD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nDhB7YiGceFA6CeD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nDhB7YiGceFA6CeD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nDhB7YiGceFA6CeD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nDhB7YiGceFA6CeD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nDhB7YiGceFA6CeD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nDhB7YiGceFA6CeD .marker.cross{stroke:#333333;}#mermaid-svg-nDhB7YiGceFA6CeD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nDhB7YiGceFA6CeD p{margin:0;}#mermaid-svg-nDhB7YiGceFA6CeD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-nDhB7YiGceFA6CeD .cluster-label text{fill:#333;}#mermaid-svg-nDhB7YiGceFA6CeD .cluster-label span{color:#333;}#mermaid-svg-nDhB7YiGceFA6CeD .cluster-label span p{background-color:transparent;}#mermaid-svg-nDhB7YiGceFA6CeD .label text,#mermaid-svg-nDhB7YiGceFA6CeD span{fill:#333;color:#333;}#mermaid-svg-nDhB7YiGceFA6CeD .node rect,#mermaid-svg-nDhB7YiGceFA6CeD .node circle,#mermaid-svg-nDhB7YiGceFA6CeD .node ellipse,#mermaid-svg-nDhB7YiGceFA6CeD .node polygon,#mermaid-svg-nDhB7YiGceFA6CeD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nDhB7YiGceFA6CeD .rough-node .label text,#mermaid-svg-nDhB7YiGceFA6CeD .node .label text,#mermaid-svg-nDhB7YiGceFA6CeD .image-shape .label,#mermaid-svg-nDhB7YiGceFA6CeD .icon-shape .label{text-anchor:middle;}#mermaid-svg-nDhB7YiGceFA6CeD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-nDhB7YiGceFA6CeD .rough-node .label,#mermaid-svg-nDhB7YiGceFA6CeD .node .label,#mermaid-svg-nDhB7YiGceFA6CeD .image-shape .label,#mermaid-svg-nDhB7YiGceFA6CeD .icon-shape .label{text-align:center;}#mermaid-svg-nDhB7YiGceFA6CeD .node.clickable{cursor:pointer;}#mermaid-svg-nDhB7YiGceFA6CeD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-nDhB7YiGceFA6CeD .arrowheadPath{fill:#333333;}#mermaid-svg-nDhB7YiGceFA6CeD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-nDhB7YiGceFA6CeD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-nDhB7YiGceFA6CeD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nDhB7YiGceFA6CeD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-nDhB7YiGceFA6CeD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nDhB7YiGceFA6CeD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-nDhB7YiGceFA6CeD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-nDhB7YiGceFA6CeD .cluster text{fill:#333;}#mermaid-svg-nDhB7YiGceFA6CeD .cluster span{color:#333;}#mermaid-svg-nDhB7YiGceFA6CeD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-nDhB7YiGceFA6CeD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-nDhB7YiGceFA6CeD rect.text{fill:none;stroke-width:0;}#mermaid-svg-nDhB7YiGceFA6CeD .icon-shape,#mermaid-svg-nDhB7YiGceFA6CeD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nDhB7YiGceFA6CeD .icon-shape p,#mermaid-svg-nDhB7YiGceFA6CeD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-nDhB7YiGceFA6CeD .icon-shape .label rect,#mermaid-svg-nDhB7YiGceFA6CeD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nDhB7YiGceFA6CeD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-nDhB7YiGceFA6CeD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-nDhB7YiGceFA6CeD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基于内存计算
每个任务占用: 1KB
期望队列内存: 100MB
队列容量 = 100 × 1024 = 102400
基于响应时间计算
预期 TPS: 100
平均执行时间: 1s
期望响应时间: 5s
队列容量 = 100 × 1 / 5 = 20

java 复制代码
// 计算公式:队列容量 = 预期任务数 * 平均执行时间 / 期望响应时间
// 例如:每秒 100 个任务,每个任务平均执行 1 秒,期望响应时间 10 秒
// 队列容量 = 100 * 1 / 10 = 10

// 或者基于内存计算:假设每个任务平均占用 1KB 内存
// 期望队列占用 100MB 内存,则队列容量 = 100 * 1024 = 102400

int expectedTPS = 100;                // 每秒任务数
int avgExecTime = 1000;               // 平均执行时间(毫秒)
int desiredResponseTime = 5000;       // 期望响应时间(毫秒)
int queueCapacity = expectedTPS * avgExecTime / desiredResponseTime;

3.3 拒绝策略选择

不同的业务场景需要选择不同的拒绝策略:
#mermaid-svg-Ebe58dIU97U4aAgX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Ebe58dIU97U4aAgX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ebe58dIU97U4aAgX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ebe58dIU97U4aAgX .error-icon{fill:#552222;}#mermaid-svg-Ebe58dIU97U4aAgX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ebe58dIU97U4aAgX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ebe58dIU97U4aAgX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ebe58dIU97U4aAgX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ebe58dIU97U4aAgX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ebe58dIU97U4aAgX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ebe58dIU97U4aAgX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ebe58dIU97U4aAgX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ebe58dIU97U4aAgX .marker.cross{stroke:#333333;}#mermaid-svg-Ebe58dIU97U4aAgX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ebe58dIU97U4aAgX p{margin:0;}#mermaid-svg-Ebe58dIU97U4aAgX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Ebe58dIU97U4aAgX .cluster-label text{fill:#333;}#mermaid-svg-Ebe58dIU97U4aAgX .cluster-label span{color:#333;}#mermaid-svg-Ebe58dIU97U4aAgX .cluster-label span p{background-color:transparent;}#mermaid-svg-Ebe58dIU97U4aAgX .label text,#mermaid-svg-Ebe58dIU97U4aAgX span{fill:#333;color:#333;}#mermaid-svg-Ebe58dIU97U4aAgX .node rect,#mermaid-svg-Ebe58dIU97U4aAgX .node circle,#mermaid-svg-Ebe58dIU97U4aAgX .node ellipse,#mermaid-svg-Ebe58dIU97U4aAgX .node polygon,#mermaid-svg-Ebe58dIU97U4aAgX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ebe58dIU97U4aAgX .rough-node .label text,#mermaid-svg-Ebe58dIU97U4aAgX .node .label text,#mermaid-svg-Ebe58dIU97U4aAgX .image-shape .label,#mermaid-svg-Ebe58dIU97U4aAgX .icon-shape .label{text-anchor:middle;}#mermaid-svg-Ebe58dIU97U4aAgX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Ebe58dIU97U4aAgX .rough-node .label,#mermaid-svg-Ebe58dIU97U4aAgX .node .label,#mermaid-svg-Ebe58dIU97U4aAgX .image-shape .label,#mermaid-svg-Ebe58dIU97U4aAgX .icon-shape .label{text-align:center;}#mermaid-svg-Ebe58dIU97U4aAgX .node.clickable{cursor:pointer;}#mermaid-svg-Ebe58dIU97U4aAgX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Ebe58dIU97U4aAgX .arrowheadPath{fill:#333333;}#mermaid-svg-Ebe58dIU97U4aAgX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Ebe58dIU97U4aAgX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Ebe58dIU97U4aAgX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ebe58dIU97U4aAgX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Ebe58dIU97U4aAgX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ebe58dIU97U4aAgX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Ebe58dIU97U4aAgX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Ebe58dIU97U4aAgX .cluster text{fill:#333;}#mermaid-svg-Ebe58dIU97U4aAgX .cluster span{color:#333;}#mermaid-svg-Ebe58dIU97U4aAgX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Ebe58dIU97U4aAgX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Ebe58dIU97U4aAgX rect.text{fill:none;stroke-width:0;}#mermaid-svg-Ebe58dIU97U4aAgX .icon-shape,#mermaid-svg-Ebe58dIU97U4aAgX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ebe58dIU97U4aAgX .icon-shape p,#mermaid-svg-Ebe58dIU97U4aAgX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Ebe58dIU97U4aAgX .icon-shape .label rect,#mermaid-svg-Ebe58dIU97U4aAgX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ebe58dIU97U4aAgX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Ebe58dIU97U4aAgX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Ebe58dIU97U4aAgX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 需要明确反馈
希望缓冲削峰
允许任务丢失
实时性要求高
任务被拒绝
选择哪种拒绝策略?
AbortPolicy
抛出 RejectedExecutionException
适用: 关键业务任务
CallerRunsPolicy
调用者线程执行任务
适用: 轻量级调用方
DiscardPolicy
静默丢弃不抛异常
适用: 日志/监控数据
DiscardOldestPolicy
丢弃队列最老任务
优先处理新任务

java 复制代码
// CallerRunsPolicy:调用者执行
// 优点:缓解任务提交速度,提供缓冲机会
// 缺点:可能影响调用方性能
// 适用:轻量级调用方,业务可容忍延迟
ThreadPoolExecutor callerRunsPool = new ThreadPoolExecutor(
    2, 4, 60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(100),
    new ThreadPoolExecutor.CallerRunsPolicy()
);

// AbortPolicy:抛异常(默认)
// 优点:明确反馈问题
// 缺点:需要调用方处理异常
// 适用:需要明确知道任务被拒绝的场景
ThreadPoolExecutor abortPool = new ThreadPoolExecutor(
    2, 4, 60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(100),
    new ThreadPoolExecutor.AbortPolicy()
);

// DiscardPolicy:静默丢弃
// 优点:对系统无影响
// 缺点:任务丢失无感知
// 适用:允许任务丢失的场景(如日志、监控数据)
ThreadPoolExecutor discardPool = new ThreadPoolExecutor(
    2, 4, 60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(100),
    new ThreadPoolExecutor.DiscardPolicy()
);

// DiscardOldestPolicy:丢弃最老任务
// 优点:优先处理新任务
// 缺点:可能丢弃重要任务
// 适用:实时性要求高的场景
ThreadPoolExecutor discardOldestPool = new ThreadPoolExecutor(
    2, 4, 60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(100),
    new ThreadPoolExecutor.DiscardOldestPolicy()
);

四、线程工厂与监控

4.1 自定义线程工厂

通过自定义线程工厂,可以为线程设置有意义的名称、优先级、守护线程属性等,便于问题排查和日志分析。
#mermaid-svg-a8ohYExC8AF3mIW2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-a8ohYExC8AF3mIW2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-a8ohYExC8AF3mIW2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-a8ohYExC8AF3mIW2 .error-icon{fill:#552222;}#mermaid-svg-a8ohYExC8AF3mIW2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-a8ohYExC8AF3mIW2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-a8ohYExC8AF3mIW2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-a8ohYExC8AF3mIW2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-a8ohYExC8AF3mIW2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-a8ohYExC8AF3mIW2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-a8ohYExC8AF3mIW2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-a8ohYExC8AF3mIW2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-a8ohYExC8AF3mIW2 .marker.cross{stroke:#333333;}#mermaid-svg-a8ohYExC8AF3mIW2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-a8ohYExC8AF3mIW2 p{margin:0;}#mermaid-svg-a8ohYExC8AF3mIW2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-a8ohYExC8AF3mIW2 .cluster-label text{fill:#333;}#mermaid-svg-a8ohYExC8AF3mIW2 .cluster-label span{color:#333;}#mermaid-svg-a8ohYExC8AF3mIW2 .cluster-label span p{background-color:transparent;}#mermaid-svg-a8ohYExC8AF3mIW2 .label text,#mermaid-svg-a8ohYExC8AF3mIW2 span{fill:#333;color:#333;}#mermaid-svg-a8ohYExC8AF3mIW2 .node rect,#mermaid-svg-a8ohYExC8AF3mIW2 .node circle,#mermaid-svg-a8ohYExC8AF3mIW2 .node ellipse,#mermaid-svg-a8ohYExC8AF3mIW2 .node polygon,#mermaid-svg-a8ohYExC8AF3mIW2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-a8ohYExC8AF3mIW2 .rough-node .label text,#mermaid-svg-a8ohYExC8AF3mIW2 .node .label text,#mermaid-svg-a8ohYExC8AF3mIW2 .image-shape .label,#mermaid-svg-a8ohYExC8AF3mIW2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-a8ohYExC8AF3mIW2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-a8ohYExC8AF3mIW2 .rough-node .label,#mermaid-svg-a8ohYExC8AF3mIW2 .node .label,#mermaid-svg-a8ohYExC8AF3mIW2 .image-shape .label,#mermaid-svg-a8ohYExC8AF3mIW2 .icon-shape .label{text-align:center;}#mermaid-svg-a8ohYExC8AF3mIW2 .node.clickable{cursor:pointer;}#mermaid-svg-a8ohYExC8AF3mIW2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-a8ohYExC8AF3mIW2 .arrowheadPath{fill:#333333;}#mermaid-svg-a8ohYExC8AF3mIW2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-a8ohYExC8AF3mIW2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-a8ohYExC8AF3mIW2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-a8ohYExC8AF3mIW2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-a8ohYExC8AF3mIW2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-a8ohYExC8AF3mIW2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-a8ohYExC8AF3mIW2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-a8ohYExC8AF3mIW2 .cluster text{fill:#333;}#mermaid-svg-a8ohYExC8AF3mIW2 .cluster span{color:#333;}#mermaid-svg-a8ohYExC8AF3mIW2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-a8ohYExC8AF3mIW2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-a8ohYExC8AF3mIW2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-a8ohYExC8AF3mIW2 .icon-shape,#mermaid-svg-a8ohYExC8AF3mIW2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-a8ohYExC8AF3mIW2 .icon-shape p,#mermaid-svg-a8ohYExC8AF3mIW2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-a8ohYExC8AF3mIW2 .icon-shape .label rect,#mermaid-svg-a8ohYExC8AF3mIW2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-a8ohYExC8AF3mIW2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-a8ohYExC8AF3mIW2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-a8ohYExC8AF3mIW2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} NamingThreadFactory
namePrefix: 业务前缀
daemon: 是否守护线程
newThread
设置线程名称
设置优先级
设置未捕获异常处理器
返回 Thread 对象

java 复制代码
public class NamingThreadFactory implements ThreadFactory {
    private final AtomicInteger threadNumber = new AtomicInteger(1);
    private final String namePrefix;
    private final boolean daemon;

    public NamingThreadFactory(String namePrefix) {
        this(namePrefix, false);
    }

    public NamingThreadFactory(String namePrefix, boolean daemon) {
        this.namePrefix = namePrefix;
        this.daemon = daemon;
    }

    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r, namePrefix + "-thread-" + threadNumber.getAndIncrement());
        thread.setDaemon(daemon);
        thread.setPriority(Thread.NORM_PRIORITY);
        thread.setUncaughtExceptionHandler((t, e) -> {
            System.err.println("线程 " + t.getName() + " 发生未捕获异常: " + e.getMessage());
            e.printStackTrace();
        });
        return thread;
    }
}

// 使用自定义线程工厂
ExecutorService pool = new ThreadPoolExecutor(
    2, 10, 60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(100),
    new NamingThreadFactory("business-processor", false)
);

4.2 线程池监控

对线程池进行监控可以及时发现性能问题,常见的监控指标包括:活跃线程数、队列大小、已完成任务数、拒绝任务数等。
#mermaid-svg-8TwFi6EWllGgZTRQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8TwFi6EWllGgZTRQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8TwFi6EWllGgZTRQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8TwFi6EWllGgZTRQ .error-icon{fill:#552222;}#mermaid-svg-8TwFi6EWllGgZTRQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8TwFi6EWllGgZTRQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8TwFi6EWllGgZTRQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8TwFi6EWllGgZTRQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8TwFi6EWllGgZTRQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8TwFi6EWllGgZTRQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8TwFi6EWllGgZTRQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8TwFi6EWllGgZTRQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8TwFi6EWllGgZTRQ .marker.cross{stroke:#333333;}#mermaid-svg-8TwFi6EWllGgZTRQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8TwFi6EWllGgZTRQ p{margin:0;}#mermaid-svg-8TwFi6EWllGgZTRQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8TwFi6EWllGgZTRQ .cluster-label text{fill:#333;}#mermaid-svg-8TwFi6EWllGgZTRQ .cluster-label span{color:#333;}#mermaid-svg-8TwFi6EWllGgZTRQ .cluster-label span p{background-color:transparent;}#mermaid-svg-8TwFi6EWllGgZTRQ .label text,#mermaid-svg-8TwFi6EWllGgZTRQ span{fill:#333;color:#333;}#mermaid-svg-8TwFi6EWllGgZTRQ .node rect,#mermaid-svg-8TwFi6EWllGgZTRQ .node circle,#mermaid-svg-8TwFi6EWllGgZTRQ .node ellipse,#mermaid-svg-8TwFi6EWllGgZTRQ .node polygon,#mermaid-svg-8TwFi6EWllGgZTRQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8TwFi6EWllGgZTRQ .rough-node .label text,#mermaid-svg-8TwFi6EWllGgZTRQ .node .label text,#mermaid-svg-8TwFi6EWllGgZTRQ .image-shape .label,#mermaid-svg-8TwFi6EWllGgZTRQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-8TwFi6EWllGgZTRQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8TwFi6EWllGgZTRQ .rough-node .label,#mermaid-svg-8TwFi6EWllGgZTRQ .node .label,#mermaid-svg-8TwFi6EWllGgZTRQ .image-shape .label,#mermaid-svg-8TwFi6EWllGgZTRQ .icon-shape .label{text-align:center;}#mermaid-svg-8TwFi6EWllGgZTRQ .node.clickable{cursor:pointer;}#mermaid-svg-8TwFi6EWllGgZTRQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8TwFi6EWllGgZTRQ .arrowheadPath{fill:#333333;}#mermaid-svg-8TwFi6EWllGgZTRQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8TwFi6EWllGgZTRQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8TwFi6EWllGgZTRQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8TwFi6EWllGgZTRQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8TwFi6EWllGgZTRQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8TwFi6EWllGgZTRQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8TwFi6EWllGgZTRQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8TwFi6EWllGgZTRQ .cluster text{fill:#333;}#mermaid-svg-8TwFi6EWllGgZTRQ .cluster span{color:#333;}#mermaid-svg-8TwFi6EWllGgZTRQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8TwFi6EWllGgZTRQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8TwFi6EWllGgZTRQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-8TwFi6EWllGgZTRQ .icon-shape,#mermaid-svg-8TwFi6EWllGgZTRQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8TwFi6EWllGgZTRQ .icon-shape p,#mermaid-svg-8TwFi6EWllGgZTRQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8TwFi6EWllGgZTRQ .icon-shape .label rect,#mermaid-svg-8TwFi6EWllGgZTRQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8TwFi6EWllGgZTRQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8TwFi6EWllGgZTRQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8TwFi6EWllGgZTRQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ThreadPoolMonitor
定时监控
活跃线程数

getActiveCount()
队列大小

getQueue().size()
已完成任务数

getCompletedTaskCount()
待处理任务数

getTaskCount() - getCompletedTaskCount()
每 10s 输出日志

java 复制代码
public class ThreadPoolMonitor {
    private final ThreadPoolExecutor executor;
    private final String name;
    private final ScheduledExecutorService scheduler;

    public ThreadPoolMonitor(ThreadPoolExecutor executor, String name) {
        this.executor = executor;
        this.name = name;
        this.scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(this::logStatus, 10, 10, TimeUnit.SECONDS);
    }

    private void logStatus() {
        System.out.println(String.format(
            "[%s] 活跃线程: %d, 队列大小: %d, 已完成任务: %d, 拒绝任务: %d",
            name,
            executor.getActiveCount(),
            executor.getQueue().size(),
            executor.getCompletedTaskCount(),
            executor.getTaskCount() - executor.getCompletedTaskCount()
        ));
    }

    public void shutdown() {
        scheduler.shutdown();
    }
}

五、常见问题与最佳实践

5.1 线程池使用常见错误

#mermaid-svg-ggSj5Q6ul8azYi1A{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ggSj5Q6ul8azYi1A .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ggSj5Q6ul8azYi1A .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ggSj5Q6ul8azYi1A .error-icon{fill:#552222;}#mermaid-svg-ggSj5Q6ul8azYi1A .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ggSj5Q6ul8azYi1A .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ggSj5Q6ul8azYi1A .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ggSj5Q6ul8azYi1A .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ggSj5Q6ul8azYi1A .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ggSj5Q6ul8azYi1A .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ggSj5Q6ul8azYi1A .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ggSj5Q6ul8azYi1A .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ggSj5Q6ul8azYi1A .marker.cross{stroke:#333333;}#mermaid-svg-ggSj5Q6ul8azYi1A svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ggSj5Q6ul8azYi1A p{margin:0;}#mermaid-svg-ggSj5Q6ul8azYi1A .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ggSj5Q6ul8azYi1A .cluster-label text{fill:#333;}#mermaid-svg-ggSj5Q6ul8azYi1A .cluster-label span{color:#333;}#mermaid-svg-ggSj5Q6ul8azYi1A .cluster-label span p{background-color:transparent;}#mermaid-svg-ggSj5Q6ul8azYi1A .label text,#mermaid-svg-ggSj5Q6ul8azYi1A span{fill:#333;color:#333;}#mermaid-svg-ggSj5Q6ul8azYi1A .node rect,#mermaid-svg-ggSj5Q6ul8azYi1A .node circle,#mermaid-svg-ggSj5Q6ul8azYi1A .node ellipse,#mermaid-svg-ggSj5Q6ul8azYi1A .node polygon,#mermaid-svg-ggSj5Q6ul8azYi1A .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ggSj5Q6ul8azYi1A .rough-node .label text,#mermaid-svg-ggSj5Q6ul8azYi1A .node .label text,#mermaid-svg-ggSj5Q6ul8azYi1A .image-shape .label,#mermaid-svg-ggSj5Q6ul8azYi1A .icon-shape .label{text-anchor:middle;}#mermaid-svg-ggSj5Q6ul8azYi1A .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ggSj5Q6ul8azYi1A .rough-node .label,#mermaid-svg-ggSj5Q6ul8azYi1A .node .label,#mermaid-svg-ggSj5Q6ul8azYi1A .image-shape .label,#mermaid-svg-ggSj5Q6ul8azYi1A .icon-shape .label{text-align:center;}#mermaid-svg-ggSj5Q6ul8azYi1A .node.clickable{cursor:pointer;}#mermaid-svg-ggSj5Q6ul8azYi1A .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ggSj5Q6ul8azYi1A .arrowheadPath{fill:#333333;}#mermaid-svg-ggSj5Q6ul8azYi1A .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ggSj5Q6ul8azYi1A .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ggSj5Q6ul8azYi1A .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ggSj5Q6ul8azYi1A .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ggSj5Q6ul8azYi1A .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ggSj5Q6ul8azYi1A .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ggSj5Q6ul8azYi1A .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ggSj5Q6ul8azYi1A .cluster text{fill:#333;}#mermaid-svg-ggSj5Q6ul8azYi1A .cluster span{color:#333;}#mermaid-svg-ggSj5Q6ul8azYi1A div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ggSj5Q6ul8azYi1A .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ggSj5Q6ul8azYi1A rect.text{fill:none;stroke-width:0;}#mermaid-svg-ggSj5Q6ul8azYi1A .icon-shape,#mermaid-svg-ggSj5Q6ul8azYi1A .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ggSj5Q6ul8azYi1A .icon-shape p,#mermaid-svg-ggSj5Q6ul8azYi1A .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ggSj5Q6ul8azYi1A .icon-shape .label rect,#mermaid-svg-ggSj5Q6ul8azYi1A .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ggSj5Q6ul8azYi1A .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ggSj5Q6ul8azYi1A .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ggSj5Q6ul8azYi1A :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 正确做法
使用 ThreadPoolExecutor 显式构造
设置队列大小

明确拒绝策略
使用 try-with-resources
自动关闭线程池
错误做法
使用 Executors.newFixedThreadPool()
LinkedBlockingQueue

默认 Integer.MAX_VALUE
导致 OOM
不关闭线程池
线程一直存活

资源泄漏

java 复制代码
// ❌ 错误1:使用 Executors 创建线程池(可能导致 OOM)
ExecutorService pool = Executors.newFixedThreadPool(100);
// LinkedBlockingQueue 默认 Integer.MAX_VALUE,可能堆积大量任务

// ✅ 正确:使用 ThreadPoolExecutor 并设置队列大小
ExecutorService pool = new ThreadPoolExecutor(
    10, 100, 60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(1000),
    new ThreadPoolExecutor.CallerRunsPolicy()
);

// ❌ 错误2:不关闭线程池
public void submitTask(Runnable task) {
    ExecutorService pool = Executors.newFixedThreadPool(10);
    pool.submit(task);
    // 忘记关闭,线程池一直存在
}

// ✅ 正确:使用 try-with-resources 或手动关闭
try (ExecutorService pool = Executors.newFixedThreadPool(10)) {
    pool.submit(task);
} // 自动关闭

// 或者使用 @Service 等容器管理的 bean
// @Bean
// public ExecutorService taskExecutor() {
//     return new ThreadPoolExecutor(...);
// }

5.2 线程池配置建议

根据业务场景给出以下配置建议:
#mermaid-svg-eDGSmJiAG0idngjc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-eDGSmJiAG0idngjc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-eDGSmJiAG0idngjc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-eDGSmJiAG0idngjc .error-icon{fill:#552222;}#mermaid-svg-eDGSmJiAG0idngjc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-eDGSmJiAG0idngjc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-eDGSmJiAG0idngjc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-eDGSmJiAG0idngjc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-eDGSmJiAG0idngjc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-eDGSmJiAG0idngjc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-eDGSmJiAG0idngjc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-eDGSmJiAG0idngjc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-eDGSmJiAG0idngjc .marker.cross{stroke:#333333;}#mermaid-svg-eDGSmJiAG0idngjc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-eDGSmJiAG0idngjc p{margin:0;}#mermaid-svg-eDGSmJiAG0idngjc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-eDGSmJiAG0idngjc .cluster-label text{fill:#333;}#mermaid-svg-eDGSmJiAG0idngjc .cluster-label span{color:#333;}#mermaid-svg-eDGSmJiAG0idngjc .cluster-label span p{background-color:transparent;}#mermaid-svg-eDGSmJiAG0idngjc .label text,#mermaid-svg-eDGSmJiAG0idngjc span{fill:#333;color:#333;}#mermaid-svg-eDGSmJiAG0idngjc .node rect,#mermaid-svg-eDGSmJiAG0idngjc .node circle,#mermaid-svg-eDGSmJiAG0idngjc .node ellipse,#mermaid-svg-eDGSmJiAG0idngjc .node polygon,#mermaid-svg-eDGSmJiAG0idngjc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-eDGSmJiAG0idngjc .rough-node .label text,#mermaid-svg-eDGSmJiAG0idngjc .node .label text,#mermaid-svg-eDGSmJiAG0idngjc .image-shape .label,#mermaid-svg-eDGSmJiAG0idngjc .icon-shape .label{text-anchor:middle;}#mermaid-svg-eDGSmJiAG0idngjc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-eDGSmJiAG0idngjc .rough-node .label,#mermaid-svg-eDGSmJiAG0idngjc .node .label,#mermaid-svg-eDGSmJiAG0idngjc .image-shape .label,#mermaid-svg-eDGSmJiAG0idngjc .icon-shape .label{text-align:center;}#mermaid-svg-eDGSmJiAG0idngjc .node.clickable{cursor:pointer;}#mermaid-svg-eDGSmJiAG0idngjc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-eDGSmJiAG0idngjc .arrowheadPath{fill:#333333;}#mermaid-svg-eDGSmJiAG0idngjc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-eDGSmJiAG0idngjc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-eDGSmJiAG0idngjc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eDGSmJiAG0idngjc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-eDGSmJiAG0idngjc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eDGSmJiAG0idngjc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-eDGSmJiAG0idngjc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-eDGSmJiAG0idngjc .cluster text{fill:#333;}#mermaid-svg-eDGSmJiAG0idngjc .cluster span{color:#333;}#mermaid-svg-eDGSmJiAG0idngjc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-eDGSmJiAG0idngjc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-eDGSmJiAG0idngjc rect.text{fill:none;stroke-width:0;}#mermaid-svg-eDGSmJiAG0idngjc .icon-shape,#mermaid-svg-eDGSmJiAG0idngjc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eDGSmJiAG0idngjc .icon-shape p,#mermaid-svg-eDGSmJiAG0idngjc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-eDGSmJiAG0idngjc .icon-shape .label rect,#mermaid-svg-eDGSmJiAG0idngjc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eDGSmJiAG0idngjc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-eDGSmJiAG0idngjc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-eDGSmJiAG0idngjc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 混合型
线程数: 动态调整
根据任务执行时间

动态调整线程数
通过压测确定最优值
IO 密集型
corePoolSize = CPU 核心数 × 2

maximumPoolSize = CPU 核心数 × 2
队列: LinkedBlockingQueue(1000)
策略: CallerRunsPolicy
计算密集型
corePoolSize = CPU 核心数

maximumPoolSize = CPU 核心数
队列: LinkedBlockingQueue(10000)
策略: CallerRunsPolicy

java 复制代码
// 计算密集型任务
// 线程数 = CPU 核心数
// 队列容量根据内存和任务特性确定
new ThreadPoolExecutor(
    Runtime.getRuntime().availableProcessors(),
    Runtime.getRuntime().availableProcessors(),
    0L, TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<>(10000),
    new CallerRunsPolicy()
)

// IO 密集型任务
// 线程数 = CPU 核心数 * 2
// 队列可以设置大一些
new ThreadPoolExecutor(
    Runtime.getRuntime().availableProcessors() * 2,
    Runtime.getRuntime().availableProcessors() * 2,
    60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(1000),
    new CallerRunsPolicy()
)

// 混合型任务
// 使用动态调整的线程池
// 根据任务执行时间动态调整线程数

5.3 业务线程池隔离

不同业务类型的任务应当使用不同的线程池,避免相互影响。
#mermaid-svg-T38BjgNBJDe66fk9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-T38BjgNBJDe66fk9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-T38BjgNBJDe66fk9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-T38BjgNBJDe66fk9 .error-icon{fill:#552222;}#mermaid-svg-T38BjgNBJDe66fk9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-T38BjgNBJDe66fk9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-T38BjgNBJDe66fk9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-T38BjgNBJDe66fk9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-T38BjgNBJDe66fk9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-T38BjgNBJDe66fk9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-T38BjgNBJDe66fk9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-T38BjgNBJDe66fk9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-T38BjgNBJDe66fk9 .marker.cross{stroke:#333333;}#mermaid-svg-T38BjgNBJDe66fk9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-T38BjgNBJDe66fk9 p{margin:0;}#mermaid-svg-T38BjgNBJDe66fk9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-T38BjgNBJDe66fk9 .cluster-label text{fill:#333;}#mermaid-svg-T38BjgNBJDe66fk9 .cluster-label span{color:#333;}#mermaid-svg-T38BjgNBJDe66fk9 .cluster-label span p{background-color:transparent;}#mermaid-svg-T38BjgNBJDe66fk9 .label text,#mermaid-svg-T38BjgNBJDe66fk9 span{fill:#333;color:#333;}#mermaid-svg-T38BjgNBJDe66fk9 .node rect,#mermaid-svg-T38BjgNBJDe66fk9 .node circle,#mermaid-svg-T38BjgNBJDe66fk9 .node ellipse,#mermaid-svg-T38BjgNBJDe66fk9 .node polygon,#mermaid-svg-T38BjgNBJDe66fk9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-T38BjgNBJDe66fk9 .rough-node .label text,#mermaid-svg-T38BjgNBJDe66fk9 .node .label text,#mermaid-svg-T38BjgNBJDe66fk9 .image-shape .label,#mermaid-svg-T38BjgNBJDe66fk9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-T38BjgNBJDe66fk9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-T38BjgNBJDe66fk9 .rough-node .label,#mermaid-svg-T38BjgNBJDe66fk9 .node .label,#mermaid-svg-T38BjgNBJDe66fk9 .image-shape .label,#mermaid-svg-T38BjgNBJDe66fk9 .icon-shape .label{text-align:center;}#mermaid-svg-T38BjgNBJDe66fk9 .node.clickable{cursor:pointer;}#mermaid-svg-T38BjgNBJDe66fk9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-T38BjgNBJDe66fk9 .arrowheadPath{fill:#333333;}#mermaid-svg-T38BjgNBJDe66fk9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-T38BjgNBJDe66fk9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-T38BjgNBJDe66fk9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-T38BjgNBJDe66fk9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-T38BjgNBJDe66fk9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-T38BjgNBJDe66fk9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-T38BjgNBJDe66fk9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-T38BjgNBJDe66fk9 .cluster text{fill:#333;}#mermaid-svg-T38BjgNBJDe66fk9 .cluster span{color:#333;}#mermaid-svg-T38BjgNBJDe66fk9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-T38BjgNBJDe66fk9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-T38BjgNBJDe66fk9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-T38BjgNBJDe66fk9 .icon-shape,#mermaid-svg-T38BjgNBJDe66fk9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-T38BjgNBJDe66fk9 .icon-shape p,#mermaid-svg-T38BjgNBJDe66fk9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-T38BjgNBJDe66fk9 .icon-shape .label rect,#mermaid-svg-T38BjgNBJDe66fk9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-T38BjgNBJDe66fk9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-T38BjgNBJDe66fk9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-T38BjgNBJDe66fk9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 任务执行
线程池隔离层
业务层
OrderService

订单服务
PushService

推送服务
ReportService

报表服务
orderExecutor

core:10 / max:20

queue:1000
pushExecutor

core:5 / max:10

queue:5000
reportExecutor

core:2 / max:4

queue:100
订单处理任务
消息推送任务
报表生成任务

java 复制代码
@Configuration
public class ThreadPoolConfig {

    // 订单处理线程池
    @Bean("orderExecutor")
    public Executor orderExecutor() {
        return new ThreadPoolExecutor(
            10, 20, 60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(1000),
            new NamingThreadFactory("order-processor"),
            new CallerRunsPolicy()
        );
    }

    // 消息推送线程池
    @Bean("pushExecutor")
    public Executor pushExecutor() {
        return new ThreadPoolExecutor(
            5, 10, 60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(5000),
            new NamingThreadFactory("push-processor"),
            new DiscardOldestPolicy()
        );
    }

    // 报表生成线程池
    @Bean("reportExecutor")
    public Executor reportExecutor() {
        return new ThreadPoolExecutor(
            2, 4, 300L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(100),
            new NamingThreadFactory("report-processor"),
            new CallerRunsPolicy()
        );
    }
}

// 使用
@Service
public class OrderService {
    @Autowired
    @Qualifier("orderExecutor")
    private Executor orderExecutor;

    public void processOrder(Order order) {
        orderExecutor.execute(() -> {
            // 处理订单
        });
    }
}

六、面试常见问题

问题1:线程池的核心线程数如何设置?

这取决于任务类型。CPU 密集型任务建议设置为 CPU 核心数加一,因为可能会有少量线程因缓存失效等原因阻塞。IO 密集型任务建议设置为 CPU 核心数的两倍,因为线程在 IO 等待时可以切换到其他任务。混合型任务需要通过压测确定最优值。

问题2:为什么阿里规范要求使用 ThreadPoolExecutor 而不是 Executors?

Executors 创建的线程池存在风险:newFixedThreadPoolnewSingleThreadExecutor 使用无界队列,可能导致 OOM;newCachedThreadPool 的 maximumPoolSize 为 Integer.MAX_VALUE,可能创建过多线程。使用 ThreadPoolExecutor 可以明确设置队列大小和最大线程数。

问题3:线程池的 execute 和 submit 方法有什么区别?

execute 方法用于执行 Runnable 任务,没有返回值,不能取消任务。submit 方法可以执行 Runnable 或 Callable 任务,返回 Future 对象,可以通过 get() 获取返回值或取消任务。

问题4:如何合理设置队列大小?

队列大小的设置需要考虑:内存限制(每个任务在队列中占用一定内存)、期望的响应时间(队列越大,任务等待时间越长)、任务产生速度和处理速度的差异。建议通过压测确定最优值。


总结

线程池是 Java 并发编程的核心组件,合理的配置对于系统性能至关重要。理解线程池的七个核心参数、五种状态转换、队列类型的选择以及拒绝策略的使用场景,能够帮助开发者构建高效可靠的并发系统。在实际应用中,应当根据业务特点进行针对性调优,并通过监控持续优化线程池配置。


附录:全文架构总览

#mermaid-svg-WgcVOEecLNBgYsE8{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WgcVOEecLNBgYsE8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WgcVOEecLNBgYsE8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WgcVOEecLNBgYsE8 .error-icon{fill:#552222;}#mermaid-svg-WgcVOEecLNBgYsE8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WgcVOEecLNBgYsE8 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WgcVOEecLNBgYsE8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WgcVOEecLNBgYsE8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WgcVOEecLNBgYsE8 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WgcVOEecLNBgYsE8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WgcVOEecLNBgYsE8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WgcVOEecLNBgYsE8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WgcVOEecLNBgYsE8 .marker.cross{stroke:#333333;}#mermaid-svg-WgcVOEecLNBgYsE8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WgcVOEecLNBgYsE8 p{margin:0;}#mermaid-svg-WgcVOEecLNBgYsE8 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WgcVOEecLNBgYsE8 .cluster-label text{fill:#333;}#mermaid-svg-WgcVOEecLNBgYsE8 .cluster-label span{color:#333;}#mermaid-svg-WgcVOEecLNBgYsE8 .cluster-label span p{background-color:transparent;}#mermaid-svg-WgcVOEecLNBgYsE8 .label text,#mermaid-svg-WgcVOEecLNBgYsE8 span{fill:#333;color:#333;}#mermaid-svg-WgcVOEecLNBgYsE8 .node rect,#mermaid-svg-WgcVOEecLNBgYsE8 .node circle,#mermaid-svg-WgcVOEecLNBgYsE8 .node ellipse,#mermaid-svg-WgcVOEecLNBgYsE8 .node polygon,#mermaid-svg-WgcVOEecLNBgYsE8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WgcVOEecLNBgYsE8 .rough-node .label text,#mermaid-svg-WgcVOEecLNBgYsE8 .node .label text,#mermaid-svg-WgcVOEecLNBgYsE8 .image-shape .label,#mermaid-svg-WgcVOEecLNBgYsE8 .icon-shape .label{text-anchor:middle;}#mermaid-svg-WgcVOEecLNBgYsE8 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WgcVOEecLNBgYsE8 .rough-node .label,#mermaid-svg-WgcVOEecLNBgYsE8 .node .label,#mermaid-svg-WgcVOEecLNBgYsE8 .image-shape .label,#mermaid-svg-WgcVOEecLNBgYsE8 .icon-shape .label{text-align:center;}#mermaid-svg-WgcVOEecLNBgYsE8 .node.clickable{cursor:pointer;}#mermaid-svg-WgcVOEecLNBgYsE8 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WgcVOEecLNBgYsE8 .arrowheadPath{fill:#333333;}#mermaid-svg-WgcVOEecLNBgYsE8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WgcVOEecLNBgYsE8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WgcVOEecLNBgYsE8 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WgcVOEecLNBgYsE8 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WgcVOEecLNBgYsE8 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WgcVOEecLNBgYsE8 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WgcVOEecLNBgYsE8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WgcVOEecLNBgYsE8 .cluster text{fill:#333;}#mermaid-svg-WgcVOEecLNBgYsE8 .cluster span{color:#333;}#mermaid-svg-WgcVOEecLNBgYsE8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WgcVOEecLNBgYsE8 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WgcVOEecLNBgYsE8 rect.text{fill:none;stroke-width:0;}#mermaid-svg-WgcVOEecLNBgYsE8 .icon-shape,#mermaid-svg-WgcVOEecLNBgYsE8 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WgcVOEecLNBgYsE8 .icon-shape p,#mermaid-svg-WgcVOEecLNBgYsE8 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WgcVOEecLNBgYsE8 .icon-shape .label rect,#mermaid-svg-WgcVOEecLNBgYsE8 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WgcVOEecLNBgYsE8 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WgcVOEecLNBgYsE8 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WgcVOEecLNBgYsE8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 线程池核心参数与调优策略
一、核心参数详解
二、状态管理
三、调优策略
四、线程工厂与监控
五、最佳实践
7 大构造函数参数
工作流程

core → queue → max → reject
队列类型选择

无界/有界/同步/优先级
5 种状态: RUNNING → TERMINATED
状态转换: shutdown/shutdownNow
优雅关闭: awaitTermination
任务类型分析

CPU/IO/混合
队列容量计算
4 种拒绝策略选择
自定义线程工厂
监控指标: 活跃线程/队列/完成数
避免 Executors OOM
业务线程池隔离
常见面试题

相关推荐
故渊at5 小时前
第十一板块:Android 跨进程通信与 Binder 深度剖析 | 第二十七篇:Binder 线程池与死亡通知(Death Recipient)机制
android·binder·线程池·死亡通知·跨进程通讯
callJJ1 天前
Java 线程池使用指南:基于 Spring Boot 3.x + JDK 17 的入门与实践
java·开发语言·spring boot·线程池·多线程编程
吴声子夜歌3 天前
JVM——线程池实现原理
java·jvm·线程池
拾光Ծ11 天前
【Linux系统编程】线程池项目实战与基于策略模式的日志系统
linux·bash·线程池·策略模式·日志
雪碧聊技术14 天前
如何实现异步写入日志?一文详解
线程池·异步写入日志
better_liang15 天前
每日Java面试场景题知识点之-JUC并发编程核心原理与实战
java·线程池·并发编程·juc·aqs·reentrantlock·concurrenthashmap
阿维的博客日记18 天前
线程任务执行报错后,线程会不会挂掉,Java线程池
java·线程池
阿昌喜欢吃黄桃20 天前
如果线程池中线程异常后:销毁还是复用?
java·线程·线程池·多线程·juc
是码龙不是码农22 天前
ThreadPoolExecutor 7 个核心参数详解
java·线程池·threadpool