线程池任务处理流程图解


1. 线程池核心参数

参数名 描述
corePoolSize 线程池中保持的核心线程数。即使空闲,这些线程也不会被销毁,除非设置了允许核心线程超时。
maxPoolSize 线程池中允许的最大线程数。
keepAliveSeconds 当线程数超过核心线程数时,多余的空闲线程等待新任务的时间(单位:秒)。
queueCapacity 任务队列的容量,用于存储等待执行的任务。
拒绝策略 当任务无法被线程池处理时的应对方式。

2. 线程池的任务处理逻辑

以下是线程池在任务不断增加时的变化情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@startuml
start
:提交任务;
if (核心线程未满?) then (是)
:创建核心线程处理任务;
else (否)
if (任务队列未满?) then (是)
:将任务加入队列;
else (否)
if (线程数未达最大值?) then (是)
:创建非核心线程处理任务;
else (否)
:触发拒绝策略 (如 CallerRunsPolicy);
endif
endif
endif
:任务完成后检查空闲线程;
if (空闲线程超时?) then (是)
:回收空闲线程;
else (否)
:保持线程存活;
endif
stop
@enduml

3. 图文并茂的线程池变化过程

3.1 初始阶段
  • 描述:提交任务时,线程池会优先创建核心线程(corePoolSize)来处理任务。
  • 图示
    1
    2
    3
    4
    @startuml
    :核心线程数 = corePoolSize;
    :任务队列 = 空;
    @enduml
3.2 核心线程满负荷
  • 描述:当任务数量超过 corePoolSize 时,新提交的任务会被放入任务队列(LinkedBlockingQueue)。
  • 图示
    1
    2
    3
    4
    @startuml
    :核心线程数 = corePoolSize;
    :任务队列 = 非空 (任务数量 <= queueCapacity);
    @enduml
3.3 任务队列满
  • 描述:当任务队列达到容量上限(queueCapacity)时,线程池会继续创建新线程,直到线程数量达到 maxPoolSize
  • 图示
    1
    2
    3
    4
    5
    @startuml
    :核心线程数 = corePoolSize;
    :任务队列 = 满 (任务数量 > queueCapacity);
    :线程数 = corePoolSize < 线程数 <= maxPoolSize;
    @enduml
3.4 最大线程数满
  • 描述:如果任务队列已满且线程数量达到 maxPoolSize,线程池将触发拒绝策略(CallerRunsPolicy)。
  • 图示
    1
    2
    3
    4
    5
    6
    @startuml
    :核心线程数 = corePoolSize;
    :任务队列 = 满;
    :线程数 = maxPoolSize;
    :拒绝策略 = CallerRunsPolicy (由调用线程执行任务);
    @enduml
3.5 空闲线程回收
  • 描述:当线程池中的线程数量超过 corePoolSize 时,多余的空闲线程会在空闲时间超过 keepAliveSeconds 后被回收。
  • 图示
    1
    2
    3
    4
    5
    @startuml
    :核心线程数 = corePoolSize;
    :任务队列 = 空或非满;
    :线程数 = corePoolSize (多余线程被回收);
    @enduml

4. 示例配置对比

线程池名称 corePoolSize maxPoolSize queueCapacity keepAliveSeconds
fileSendThreadPool 4 10 100 60
fileSendToolThreadPool 动态 (CPU 核心数) 动态 (CPU 核心数 × 4) 动态 (CPU 核心数 × 10) 60

5. 自定义线程工厂

CustomThreadFactory 是一个自定义线程工厂,用于创建带有特定命名规则的线程。

  • 线程名称格式
    1
    Spring-<poolName>-<threadNumber>
  • 示例
    1
    2
    Spring-file-send-pool-1
    Spring-file-send-pool-tool-1

6. 总结

通过以上分析可以看出:

  • 线程池能够动态调整线程数量以适应任务量的变化。
  • 不同的线程池配置可以根据具体业务需求进行优化。
  • 结合任务队列和拒绝策略,线程池能够在高并发场景下保证系统的稳定性和性能。
    `