前言
先来一个面试问题提提神,也是面试阿里必问的一个题目,当然本人也被问过,惊不惊奇,我也面试过阿里?哈哈哈
问题描述:
1、说下 ThreadPoolExecutor构造函数几个参数的含义
corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、rejectedExecutionHandler
这个问题上篇文章已经做了详细的描述。
2、当向线程池中加入任务时,corePoolSize、maximumPoolSize 新线程的创建时一种什么样的关系?
- 运行线程数<corePoolSize则创建新的线程池来执行提交的任务
- 运行线程数>=corePoolSize则把该任务放入队列中
- 队列已满且线程数<maximumPoolSize 则创建新的线程执行该任务
- 队列已满且线程数>=maximumPoolSize 则执行线程的拒绝策略
怎么样?上面两个问题可以小试牛刀了吧!
下面再来逐步分析下:
对比我们自己实现的线程池,JDK 中的线程池多了哪些呢?
1、线程池数量定义了两种,核心线程池 、 非核心线程池,根据实际任务动态决定线程池的数量
corePoolSize、maximumPoolSize
2、1.6之后增加 属性 allowCoreThreadTimeOut 允许核心线程池也有过期时间,避免过多资源占用
3、增加了 RejectedExecutionHandler ,当线程池数量已经最大并且任务队列已满,执行拒绝策略
4、提供了钩子beforeExecute 、afterExecute ,用于 任务的前后执行
源码参考链接:
1、https://www.throwable.club/2019/07/15/java-concurrency-thread-pool-executor/