常见面试题:Java线程状态以及对应的流转方法解答。
点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达
问:Java 中的线程有几种状态?
看到这个问题很多人都会轻蔑一笑,这么简单的问题还需要问吗?
确实要问,而且这个问题在面试中出现的比例很高。这个简单的问题在百度上搜一搜,答案众说纷纭,有说五种,有说六种,有说七种,到底哪个才是正确的呢?
要回答这个问题就要明白面试官是想问你什么。他关心的是几这个数字吗?他关心的是你是否足够清晰的了解 Java 线程,关心的是你是否了解线程各个状态之间的流转以及如何产生这些状态的变化。
由于看到网上到处都是错误的答案,我决定把这个简单的问题说一说,求轻喷。
其实关于到底有几种状态,JDK源码中已经给出答案了,作者在Thread类中定义了枚举类State,里面清晰的做了列举,共有六种。之所以争论不休,是因为大家的区分方法不一样,我建议还是以源码为准。
- public enum State {
- NEW,RUNNABLE,BLOCKED,WAITTING,TIMED_WAITTING,TERMINATED;
- }
1、新建状态(New):一个还没有启动的线程。一个线程被new出来,但是没有调用start()方法使,这个线程处于新建状态。
2、就绪状态(Runnable):一个可运行状态的线程正在执行在JVM中,但是他有可能正在等待操作系统的其他资源,比如处理器。
为了区分正在执行已经获得CPU资源的线程,很多人增加了一个运行状态(Running)的概念,其实在源码中并没有此定义。所以有人说是7种,其实不算错。
3、阻塞状态(Blocked):阻塞状态线程被阻塞正在等待锁资源的线程。是进入同步代码块或者同步方法的线程。
4.等待状态(waiting):无期限等待另一个线程执行特定操作的线程处于此状态。
5.定时等待(timed_waiting):等待另一个线程执行操作达到指定等待时间的线程处于此状态。
6、终止状态(Terminated):终止状态,该线程全部工作完成,进入此状态。
- /**
- * A thread state. A thread can be in one of the following states:
- *
- *
- {@link #NEW}
- * A thread that has not yet started is in this state.
- *
- *
- {@link #RUNNABLE}
- * A thread executing in the Java virtual machine is in this state.
- *
- *
- {@link #BLOCKED}
- * A thread that is blocked waiting for a monitor lock
- * is in this state.
- *
- *
- {@link #WAITING}
- * A thread that is waiting indefinitely for another thread to
- * perform a particular action is in this state.
- *
- *
- {@link #TIMED_WAITING}
- * A thread that is waiting for another thread to perform an action
- * for up to a specified waiting time is in this state.
- *
- *
- {@link #TERMINATED}
- * A thread that has exited is in this state.
- *
- *
关于状态之间的流转,网上的错误更多,我竟然见有人把join说成执行后流转到阻塞状态,如下图。
同样,答案都是根据源码得出的,中间的过程省略,直接上图看答案。欢迎收藏👏,有疑问可以去看源码,大家把相关结论记住就好。
最后,欢迎大家提问和交流。
如果觉得对你有帮助,欢迎点赞、标🌟或分享!