三个问题
- 基本概念
- 核心流程
- 关键细节
如何解答
- 首先你要能掌握这三个问题,掌握了这三个问题,那么剩下的就是语言表达了
- 语言表达非常重要,会,但是说不明白,那很容易让面试官觉得你不会,那他就会一直在这里问你,保不齐就会出现你遗漏的一些东西被他问道。不是说掌握了三个知识就是100%掌握,而是 80% 掌握,Java官方的很多代码细节都是值得思考借鉴的,但是,时间精力有限对吧,所以抓重点,然后说明白。个人认为达到这个程度,这个线程池这个知识点面试基本就没有问题了。以下是我对线程池知识以及话术的总结
- 描述流程要 总分总,千万不要被动等提问,这个我以后会专门总结一下技术人员的面试技巧
开始聊
基本概念
线程池是管理一组同构工作线程的资源池。通过其内部维护的工作线程集合以及任务队列来优化服务器对线程的使用。线程池有三个使用优点
- 通过线程重用,减少大量线程创建,销毁时的系统资源消耗。同时能提高线程任务的响应速度
- 便于管理,避免了各自独立创建线程可能会导致的系统内存耗尽等情况。
- 稳定性可以有效提升,通过使用线程池,可以对线程池进行调优,监控,日志记录,错误报警等功能
为了方便开发者使用,Java类库内置了四类线程池,分别时SingleThreadPool,CachedThreadPool,FixedThreadPool以及ScheduledThreadPool。其中前三种本质都是ThreadPoolExecutor。ScheduledThreadPool为ThreadPoolExecutor的子类ScheduledThreadPoolExecutor单独实现的。
线程池有五种状态
- RUNNING:运行中,能接受任务也能处理任务
- SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保存的任务。在线程池处于 RUNNING 状态时,调用 shutdown()方法会使线程池进入到该状态。(finalize() 方法在执行过程中也会调用shutdown()方法进入该状态);
- STOP:不能接受新任务,也不处理队列中的任务,会中断正在处理任务的线程。在线程池处于 RUNNING 或 SHUTDOWN 状态时,调用 shutdownNow() 方法会使线程池进入到该状态;
- TIDYING:如果所有的任务都已终止了,workerCount (有效线程数) 为0,线程池进入该状态后会调用 terminated() 方法进入TERMINATED 状态。
- TERMINATED:在terminated() 方法执行完后进入该状态,默认terminated()方法中什么也没有做。
进入TERMINATED的条件如下:- 线程池不是RUNNING状态;
- 线程池状态不是TIDYING状态或TERMINATED状态;
- 如果线程池状态是SHUTDOWN并且workerQueue为空;
- workerCount为0;
- 设置TIDYING状态成功。<