• 线程状态有几种,简单问题资料却都错了!|原创


    常见面试题:Java线程状态以及对应的流转方法解答。

    点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达

    问:Java 中的线程有几种状态?

    看到这个问题很多人都会轻蔑一笑,这么简单的问题还需要问吗?

    确实要问,而且这个问题在面试中出现的比例很高。这个简单的问题在百度上搜一搜,答案众说纷纭,有说五种,有说六种,有说七种,到底哪个才是正确的呢?

    要回答这个问题就要明白面试官是想问你什么。他关心的是几这个数字吗?他关心的是你是否足够清晰的了解 Java 线程,关心的是你是否了解线程各个状态之间的流转以及如何产生这些状态的变化。

    由于看到网上到处都是错误的答案,我决定把这个简单的问题说一说,求轻喷。

    线程有几种状态

    其实关于到底有几种状态,JDK源码中已经给出答案了,作者在Thread类中定义了枚举类State,里面清晰的做了列举,共有六种。之所以争论不休,是因为大家的区分方法不一样,我建议还是以源码为准。

    1. public enum State {
    2.  NEW,RUNNABLE,BLOCKED,WAITTING,TIMED_WAITTING,TERMINATED;
    3. }

    1、新建状态(New):一个还没有启动的线程。一个线程被new出来,但是没有调用start()方法使,这个线程处于新建状态。

    2、就绪状态(Runnable):一个可运行状态的线程正在执行在JVM中,但是他有可能正在等待操作系统的其他资源,比如处理器。

    为了区分正在执行已经获得CPU资源的线程,很多人增加了一个运行状态(Running)的概念,其实在源码中并没有此定义。所以有人说是7种,其实不算错。

    3、阻塞状态(Blocked):阻塞状态线程被阻塞正在等待锁资源的线程。是进入同步代码块或者同步方法的线程。

    4.等待状态(waiting):无期限等待另一个线程执行特定操作的线程处于此状态。

    5.定时等待(timed_waiting):等待另一个线程执行操作达到指定等待时间的线程处于此状态。

    6、终止状态(Terminated):终止状态,该线程全部工作完成,进入此状态。

    1. /**
    2.  * A thread state.  A thread can be in one of the following states:
    3.  * 
      •  * 
      • {@link #NEW}
    4.  *     A thread that has not yet started is in this state.
    5.  *     
  •  * 
  • {@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说成执行后流转到阻塞状态,如下图。

    e7ae7383960c043d8ba79e599c9f18a0.png

    同样,答案都是根据源码得出的,中间的过程省略,直接上图看答案。欢迎收藏👏,有疑问可以去看源码,大家把相关结论记住就好。

    79b2ae3f09dd5836f928a433a626fe08.png

    最后,欢迎大家提问和交流。

    如果觉得对你有帮助,欢迎点赞、标🌟分享

    关于Redis事务那些必会的问题

    2022-10-30

    aecf8cfb7d44a836156f51a6138ee12c.jpeg

    5分钟搞定,Redis的哈希表何时扩容?|原创

    2022-10-24

    1f8e5292da74d2e6109d038b09855b0f.jpeg

    「必备」破解IDEA工具,就特么差你收藏了!

    2022-08-08

    c147f252b743520b65be59e1539edeb7.jpeg
  • 相关阅读:
    三大零知识(ZK)证明系统全面深度分析:STARKs SNARKs Bulletproof
    Ajax 相关问题
    线性代数的本质(十)——矩阵分解
    android 12.0app应用卸载黑名单
    C++设计模式之外观模式(结构型模式)
    c++ 对象模型
    在Java中使用FileReader.read()进行读取文件时,为什么乱码?两个方法解决
    electron实现圆角效果
    菜菜学paddle第三篇:卷积神经网络构建手写数字识别
    win10环境下搭建QT+opencv
  • 原文地址:https://blog.csdn.net/sinat_32873711/article/details/127662448