面试官跟我聊,我就喜欢给他画图
共 4224字,需浏览 9分钟
·
2021-07-04 04:27
本文公众号来源:程序猿阿星
作者:阿星
“大家好,我是3y。今天给大家分享下我面试的小技巧。
我以前在刚开始面试的时候,经常结巴回答不好技术问题。
后来我去面试或者视频面试也好,都喜欢带上一个小本本和笔。
面试官问到后,我就在纸上写写画画,这样表述起来会更加清晰。如果是现场面试,还可以让面试官更能理解你想表达什么内容
像状态流转这种面试题,就很适合画图来进行作答(包括但不限于 Java线程状态、TCP流程等等)
线程状态
先来个开场四连问
-
Java
线程状态有几个? -
Java
线程状态是如何转换? -
Java
线程状态转换什么情况会进入锁的等待队列? -
Java
线程状态转换什么情况会进入锁的同步队列?
一提到Java
线程状态,不少读者立马想到线程状态转换图,但细想,印象又不深刻,只记得有那么几个状态。
再要你说出Java
线程状态是如何转换的,脑子里可能就如下图一样,已经是一团浆糊了。
别慌,阿星为了帮读者大大们理清楚上面的问题,会一步一步的把线程状态转换图给画出来,让读者大大们真正的理解Java线程状态转换。
首先线程的状态可以分为6
态或7
态,具体状态如下
6态
-
New
:新建状态 -
Runnable
:可运行状态 -
Terminated
:终止状态 -
Waiting
:等待状态 -
TimedWaiting
:超时等待状态 -
Blocked
:阻塞状态
7态
-
New
:新建状态 -
Ready
:就绪状态 -
Running
:运行状态 -
Terminated
:终止状态 -
Waiting
:等待状态 -
TimedWaiting
:超时等待状态 -
Blocked
:阻塞状态
其实6态与7态差别不大,只不过7
态把Runnable
可运行状态,拆解成了Ready
就绪状态与Running
运行状态。
阿星以7
态为例,来逐步讲解它们之间是如何转换的。
新建状态(New)
我们可以通过实现Runnable
接口或继承Thread
声明一个线程类,new
一个实例后,线程就进入了新建状态。
一个刚诞生的线程,处于新建状态。
就绪状态(Ready)
线程对象创建成功后,调用该线程的start()
函数,线程进入就绪状态,该状态的线程进入可运行线程池中,等待获取C P U
的使用权。
线程表示,我已经准备好了,此时我是就绪状态,快选我吧~
运行状态(Running)
此时线程调度程序正在从可运行线程池中选择一个线程,该线程进入运行状态。
换句话说,线程获取到了C P U
时间片。
还没完呢,当线程时间片用完或调用的yield()
函数,该线程回到就绪状态。
作为一名运气好的线程,我进入了运行状态,但是运气用完了,我还得回到就绪状态。
终止状态(Terminated)
线程继续运行,直到执行结束或执行过程中因异常意外终止都会使线程进入终止状态。
线程一旦终止,就不能复生,这是不可逆的过程。
线程的人生迎来了终点,可能一帆风顺过完一生,也可能英年早逝令人惋惜。
等待状态(Waiting)
运行状态的线程执行wait()、join()、LockSupport.park()任意函数,该线程进入等待状态。
其中wait()
与join()
函数会让J V M把该线程放入锁等待队列。
处于这种状态的线程不会被分配C P U执行时间,它们要等待被主动唤醒,否则会一直处于等待状态。
如果我们要唤醒线程怎么办呢?
执行LockSupport.unpark(t)
函数唤醒指定线程,该线程回到就绪状态。
而通过notify()、notifyAll()、join线程执行完毕
方式,会唤醒锁等待队列的线程,出队的线程回到就绪状态。
线程的人生迎来了劫难,听信小人之言,跑去菲律宾做打工,结果被黑工厂扣下,只希望警察叔叔能早日解救我出去。
超时等待状态(Timed waiting)
超时等待与等待状态一样,唯一的区别就是多了超时机制,不会一直等待被其他线程主动唤醒,而是到达指定时间后会自动唤醒。
以下函数会触发进入超时等待状态
-
wait(long) -
join(long) -
LockSupport.parkNanos(long) -
LockSupport.parkUtil(long) -
sleep(long)
其中wait(long)、join(long)
函数会让J V M把线程放入锁等待队列。
后面的唤醒剧情就和等待状态如出一辙,就多了超时时间到了,自动唤醒的动作。
从菲律宾回国后的线程,也做起了违法的勾当,最终被警察抓捕,好在只判了5年,熬一熬就可以出来了。
阻塞状态(Blocked)
运行状态的线程获取同步锁失败或发出I/O
请求,该线程进入阻塞状态。
如果是获取同步锁失败J V M
还会把该线程放入锁的同步队列。
同步锁被释放时,锁的同步队列会出队所有线程,进入就绪状态。
I/O
处理完毕时,该线程重新回到就绪状态。
出狱后的线程,后面的人生一直都是磕磕碰碰,就没顺利过,大家要引以为戒。
“感谢阅读到这里,我们下期见吧!
另外,《对线面试官》系列目前已经连载26篇啦!有深度风趣的系列!
-
【对线面试官】Java注解 -
【对线面试官】Java泛型 -
【对线面试官】 Java NIO -
【对线面试官】Java反射 && 动态代理 -
【对线面试官】多线程基础 -
【对线面试官】 CAS -
【对线面试官】synchronized -
【对线面试官】AQS&&ReentrantLock -
【对线面试官】线程池 -
【对线面试官】ThreadLocal -
【对线面试官】CountDownLatch和CyclicBarrier -
【对线面试官】为什么需要Java内存模型? -
【对线面试官】Java从编译到执行,发生了什么? -
【对线面试官】List -
【对线面试官】Map -
【对线面试官】SpringMVC -
【对线面试官】Spring基础 -
【对线面试官】SpringBean生命周期 -
【对线面试官】Redis基础 -
【对线面试官】Redis持久化 -
【对线面试官】Kafka基础 -
【对线面试官】使用Kafka会考虑什么问题? -
【对线面试官】MySQL索引 -
【对线面试官】MySQL 事务&&锁机制&&MVCC -
【对线面试官】MySQL调优