
线程池任务处理流程图解
线程池任务处理流程图解
1. 线程池核心参数
参数名 | 描述 |
---|---|
corePoolSize |
线程池中保持的核心线程数。即使空闲,这些线程也不会被销毁,除非设置了允许核心线程超时。 |
maxPoolSize |
线程池中允许的最大线程数。 |
keepAliveSeconds |
当线程数超过核心线程数时,多余的空闲线程等待新任务的时间(单位:秒)。 |
queueCapacity |
任务队列的容量,用于存储等待执行的任务。 |
拒绝策略 | 当任务无法被线程池处理时的应对方式。 |
2. 线程池的任务处理逻辑
以下是线程池在任务不断增加时的变化情况:
1 | @startuml |
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
2Spring-file-send-pool-1
Spring-file-send-pool-tool-1
6. 总结
通过以上分析可以看出:
- 线程池能够动态调整线程数量以适应任务量的变化。
- 不同的线程池配置可以根据具体业务需求进行优化。
- 结合任务队列和拒绝策略,线程池能够在高并发场景下保证系统的稳定性和性能。
`
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自dou
评论 ()