线程池ThreadPoolExecutor 面试题重难点
说明
本篇文章给出线程池的重难点面试题,不会给出答案,至多给出一些关键字, 需要同学自行去寻找答案 .
带着问题去学校才是有效的学习 .
建议学懂线程池,要去看线程池的源码, juc 下的 ThreadPoolExecutor .
还有一些没有提及的 , 同学们可以从别的渠道获取 , 网上资料很多 , 错误的,正确的 , 都有, 要好好甄别 . 这里仅仅是从我的个人视角 (不一定全 , 多担待 ).
为什么要使用线程池?线程池的设计思想是什么?线程池的原理是什么?
这是基本概念的问题 , 只要能正确表达意图均是可以的 , 没有死板的固定答案 .
回答这类问题 , 最好是从实际业务场景说起 .
juc 下 ThreadPoolExecutor 的 设计层次,UML 是什么结构 ?
面向接口编程
设计原则 开闭原则
设计模式 , 模板方法 , 适配器模式 , 钩子函数 ,程序的拓展 .
锁 , 队列 AQS ,CAS 操作 .
不要死板的去记 A extends B implements C ,这样, 架构思想去记忆 .
ctl 是什么 ?
高3位,低29位
runState
workerCount
线程池的声明周期
runState 的变更
RUNNING -> SHUTDOWN -> STOP -> TIDYING -> TERMINATED
任务提交 到任务的执行, 那个线程来执行的, core thread 或者 non core thread .
什么时机创建 核心线程 什么时机创建非核心线程 , 非核心线程 什么时候消亡 , 阻塞队列什么时候为空,什么时候不会空 .
execute() addWorker() runWorker() shutdown() shutdownNow() tryTerminated() 等等 .
带着流程变化去说 .
ThreadPoolExecutor 构造函数 ,线程池核心参数?
-- 这个不用写了,网上多的是
线程池的拒绝策略
juc 下 提供4个,默认是哪个? 怎么拓展, 为什么要拓展,拓展是解决什么问题 ?
任务提交到线程池流程
execute() 执行流程
3个步骤,也对应 execute() 的源码 , 我相信,认真去看 , execute() 的源码 , 看完的同学会非常熟悉这个流程 . (1遍不行,找着博客对着看 , debug 跟 )
线程在线程池中是如何存放的
Worker 类
addWorker()
runWorker()
workQueue
wokers , Set
线程池中的线程是如何创建的 工作线程是如何创建的,什么时候创建核心线程 ,什么时候创建非核心线程?
创建工作线程 , 线程工程
核心线程 coreThread
非核心线程 , 最大线程数, 阻塞队列
非核心线程消亡(核心线程也会消亡)情况,怎么补
关闭线程
shutdown() , SHUTDOWN 不在接收新任务,但会继续执行阻塞队列中任务
shutdownNow() , STOP ,不会接收新任务,也不会继续执行阻塞队列中任务 , 会把阻塞队列中的任务返回 , drainQueue()
interruptWorkers()
tryTerminated()
使用线程池有哪些问题 , 如何配置线程池 , 如何解决线程池的问题 ?
这是一个半开放问题,聊起来会很大 , 但也是可以把控的 .
从下面几个角度思考 :
参数配置 , 怎么配置 ,道理是什么?
任务执行异常如何追踪 ?
本来是好好聊线程池的,可能会突然切换话题了
真的会出现,很突然切到别的话题上了, 技术本身是有牵连的 .
线程 Thread
锁 sync lock
AQS
volatile
并发并行
原子操作
CAS , ABA 问题
再跑跑都有可能跑到OS , 来聊 linux 内核 .
寄语
面试 , 1次, 2次失败, 不要气馁 , 小本本记录好, 总结原因 , 是自己没表达好 , 还是自己有盲点 .
面试回来 , 一定要查漏补缺 .
希望码友都能找到一份高薪的,满意的工作 .