在Java面试过程中,你可能会被面试到这个问题:Java中线程的状态有几种?他们之间是怎么切换的?

你可能会回答6种,然后发现自己给自己挖了一个大坑,原来自己根本回答不出来具体是哪6种状态。回答出两三个、三四个或许还挺简单,要是让你全部回答出来就可能有点难度了。为什么呢?因为线程的6个状态之间有些确实不好区分,如果靠死记硬背很难记得长久,可能你当时看的时候还记得,也许过一段时间就又忘记了。今天这篇文章就帮助你永远不忘记线程的6个状态。

线程的状态切换其实就是线程的生命周期,说到生命我们会想到什么,没错,我们可以想到人的生命。那么把线程的生命周期和人的生命周期类比或许你就不会忘记了。

我们先看看线程的6个状态具体都是哪些(这些状态你可以通过看Thread源码获得):

  • NEW
  • RUNNABLE
  • BLOCKED
  • WAITING
  • TIMED_WAITING
  • TERMINATED

一个人从出生开始,慢慢长大到适婚的年龄之前的这个状态。对应到线程的生命周期上就是一个线程对象由JVM为其分配内存,并初始化其成员变量的值这个被创建(NEW)出来的过程,也就是达到了一个可用的状态。

然后这个人到了适婚年龄,对应到线程就是就绪的状态,也就是RUNNABLE的状态。

但是适婚年龄并不是法定的结婚年龄(想想古代人们16岁就可以结婚,就知道我国现在法律规定能够结婚的年龄要大于人类可以结婚的年龄),所以你要想结婚其实是被阻塞的。对应到线程就是被monitor阻塞了,也就是BLOCKED。

等你真的到了法定结婚的年龄,但却一直在等待一个最合适的配偶,就这样一直等啊,一直等,你也还是没有结婚。对应到线程就是一种WAITING的状态。

终于有一天你实在等不下去了,或者被家里人催着急了,也就是到了一定的年龄在世俗意义上来说你也该结婚了,那么这个时候你可能正好遇上你的真命天子,或者随便找个人就凑合过了,反正你过了一定的年龄就该结婚了。比如说你过了30岁就该结婚了,再不结就会被世俗所鄙夷。那么对应到线程就是一种TIMED_WAITING的状态,也就是线程在这种状态下不会无限等待下去,它在过了一定的时间之后就不会再等了。

最后你结婚生子,一直到生命结束。对应到线程就是TERMINATED状态。

相信通过上面这个生动的小故事,你一定不会忘记线程的6个状态具体是哪些了。

其实通过这篇文章我还想告诉大家一个道理,有些时候你看到一些人记忆力非常强大,他似乎什么都能记下来,但其实他可能并不是天生记忆力好,而是他的思维能力好,这样表现出来也是记忆力强大。就拿我来说,我承认我的记忆力确实不好,有时候我总是记不起一个人的名字,但是我可以通过类比、联想记起那个人的名字。所以,不要以为记忆力是天生的,它是可以通过训练你的思维能力得到提升的。

共勉!



技术分享      面试题

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!