1.首先线程池有几个核心的参数概念:
- 最大线程数 maximumPoolSize
- 核心线程数 corePoolSize
- 活跃时间 keepAliveTime
- 阻塞队列 workQueue
- 拒绝策略 RejectedExecutionHandler
2.当提交一个新任务到线程池时,具体的执行流程如下:
- 当我们提交任务,线程池会根据corePoolSize大小创建若干任务数量线程执行任务;
- 当任务的数量超过corePoolSize数量,后续的任务将会进入阻塞队列阻塞排队;
- 当阻塞队列也满了之后,那么将会继续创建(maximumPoolSize-corePoolSize)个数量的线程来执行任务,如果任务处理完成,maximumPoolSize-corePoolSize额外创建的线程等待keepAliveTime之后被自动销毁;
- 如果达到maximumPoolSize,阻塞队列还是满的状态,那么将根据不同的拒绝策略对应处理。
3.主要有4种拒绝策略:
- AbortPolicy:直接丢弃任务,抛出异常,这是默认策略
- CallerRunsPolicy:只用调用者所在的线程来处理任务
- DiscardOldestPolicy:丢弃等待队列中最旧的任务,并执行当前任务
- DiscardPolicy:直接丢弃任务,也不抛出异常
如果你觉得此文对你有所帮助,可以支持一下博主,一分也是缘分。