ThreadPoolExecutor 构造参数以及执行流程
ThreadPoolExecutor 构造参数以及执行流程
程序员朱永胜有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001`
ThreadPoolExecutor 构造参数
ThreadPoolExecutor
是 Java 中 java.util.concurrent
包提供的一个强大的线程池实现。它提供了多种构造方法,但最常用的构造函数如下:
1 | ThreadPoolExecutor( |
下面是每个参数的详细说明:
- corePoolSize: 核心线程数——线程池中始终保持的线程数,即使它们处于空闲状态。除非设置了
allowCoreThreadTimeOut
,否则它们不会因为闲置超时而被回收。 - maximumPoolSize: 最大线程数——线程池中允许的最大线程数。当工作队列满了之后,线程池会创建新线程,直到达到这个最大值。
- keepAliveTime: 空闲线程的存活时间——当线程数超过核心线程数时,这是超过核心线程数的线程在空闲时要等待新任务的最长时间。
- unit:
keepAliveTime
的时间单位——TimeUnit
是一个枚举,提供了时间单位,如TimeUnit.SECONDS
。 - workQueue: 工作队列——用于在执行任务之前保存任务的队列。这个队列将仅保存由
execute
方法提交的Runnable
任务。 - threadFactory: 线程工厂——用于创建新线程的工厂。使用自定义
ThreadFactory
可以自定义线程的名称、优先级、守护进程状态等。 - handler: 拒绝策略——当线程池和工作队列都满了时,定义任务的拒绝策略。例如,
ThreadPoolExecutor.AbortPolicy
是一个拒绝策略,它将抛出RejectedExecutionException
。
ThreadPoolExecutor 执行流程
线程池的工作流程大致如下:
新任务提交 :
当一个新任务被提交到线程池时,线程池会根据当前线程数量和工作队列状态采取以下行动之一:- 如果当前运行的线程数少于
corePoolSize
,则创建并启动一个新线程来处理任务,即使其他工作线程处于空闲状态。 - 如果运行的线程数等于或大于
corePoolSize
,则将任务添加到工作队列。 - 如果工作队列已满,且运行的线程数少于
maximumPoolSize
,则创建并启动一个新线程来处理任务。 - 如果工作队列已满,且运行的线程数等于
maximumPoolSize
,则根据拒绝策略处理无法执行的任务。
- 如果当前运行的线程数少于
任务执行 :
线程池中的线程会从工作队列中取出任务并执行它们。一旦线程完成了任务,它会再次从队列中获取下一个任务(如果有的话)。线程终止 :
当一个线程没有任务执行,并且超过了keepAliveTime
,如果当前运行的线程数超过corePoolSize
,这个线程将被终止,以减少资源消耗。线程池关闭 :
当我们调用shutdown()
方法时,线程池将不再接受新任务,但会继续处理工作队列中的所有剩余任务。调用shutdownNow()
方法将尝试停止所有正在执行的任务,并停止处理工作队列中的任务。
通过合理配置这些参数,可以创建一个既能够处理动态变化的负载,又能够有效管理系统资源的线程池。