线程池ThreadPoolExecutor 面试题重难点

518 阅读3分钟

线程池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次失败, 不要气馁 , 小本本记录好, 总结原因 , 是自己没表达好 , 还是自己有盲点 .

面试回来 , 一定要查漏补缺 .

希望码友都能找到一份高薪的,满意的工作 .