首先线程池有几个核心的参数概念:
- 最大线程数maximumPoolSize
- 核心线程数corePoolSize
- 活跃时间keepAliveTime
- 阻塞队列workQueue
- 拒绝策略RejectedExecutionHandler
当提交一个新任务到线程池时,具体的执行流程如下:
-
当我们提交任务,线程池会根据corePoolSize大小创建若干任务数量线程执行任务
-
当任务的数量超过corePoolSize数量,后续的任务将会进入阻塞队列阻塞排队
-
当阻塞队列也满了之后,那么将会继续创建(maximumPoolSize-corePoolSize)个数量的线程来执
行任务,如果任务处理完成,maximumPoolSize-corePoolSize额外创建的线程等待
keepAliveTime之后被自动销毁 -
如果达到maximumPoolSize,阻塞队列还是满的状态,那么将根据不同的拒绝策略对应处理
拒绝策略:
主要有4种拒绝策略:
- AbortPolicy:直接丢弃任务,抛出异常,这是默认策略
- CallerRunsPolicy:只用调用者所在的线程来处理任务
- DiscardOldestPolicy:丢弃等待队列中最旧的任务,并执行当前任务
- DiscardPolicy:直接丢弃任务,也不抛出异常
标题:线程池原理
作者:barryzpc
地址:https://myblog.zhengpc.com/articles/2024/04/26/1714120781404.html
说明:转载请注明出处
赞赏:如果对你有帮助,可略微支持一下