Java JVM中线程状态详解

作者:义臻 时间:2023-01-24 16:06:19 

前言:

在Java面试中,线程的状态也是被经常考察的知识点,今天我们就来聊一聊线程状态的那些事!

线程在JVM中的状态

查看线程在JVM中有哪些不同的状态,最简单的方式是查看Jdk源码的Thread.State类。以下内容来自JDK文档。在JVM中,一个线程可能处于下面的六种状态中的一种:

NEW

A thread that has not yet started is in this state. 没有开始执行的线程处于这种状态

RUNNABLE

A thread executing in the Java virtual machine is in this state. 在JVM中执行的线程处于这种状态

BLOCKED

A thread that is blocked waiting for a monitor lock is in this state. 因为等待监视器锁而处于等待的线程处于这种状态

WAITING

A thread that is waiting indefinitely for another thread to perform a particular action is in this state. 等待另一个线程执行某些特别操作的线程处于这种状态。补充:实际上,这个线程等待的条件称为条件谓词,这个线程等待的位置称为条件队列。来源大牛的书《Java Concurrency in Proactice》

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. 等待另一个线程执行某些特别操作的线程(有时间限制)处于这种状态

TERMINATED

A thread that has exited is in this state. 一个已经执行完毕的线程处于这种状态

可见,一个线程在JVM中有6种不同的状态。此处我想强调一下,这个线程在JVM中的状态,并不能反映操作系统级别的线程状态。

线程在JVM中的状态转换

JDK源码的注释中详细的描述了不同状态之间在哪些条件下进行转换,本文中我用一个图来进行表示。 由于CPU的时间片轮转机制,处于Runnable状态的线程可以分为两种:Ready(就绪)和Running(运行)。因此,我们的状态图中有7种状态节点。

如下图:

Java JVM中线程状态详解

上图中展示了线程在不同状态之间的转换情况,在调用与线程有关的方法后,线程会进入不同的线程状态,这些状态之间某些是双向的,比如WAITING和RUNNING之间可以循环的进行切换。而有些是单向的,比如终止后不能再次进入终止状态。

针对上面的图,可以询问的面试点有很多。比如线程的监视器锁机制、比如线程协同的机制等等,读者要结合图片仔细研究。最后是一个例子,展示了5种线程状态(除Waiting状态)。

import java.util.concurrent.TimeUnit;

/**
* Created by yizhenn on 2020/4/20.
*/
public class Demo{
   private static Object lock=new Object();
   public static void main(String[] args) throws Exception {
      Thread t1=new Thread(new Runnable() {
          @Override
          public void run() {
              synchronized (lock){
                  System.out.println("t1 executing...");
                  try {
                      TimeUnit.SECONDS.sleep(10);
                  }catch (Exception e){
                      e.printStackTrace();
                  }
              }
          }
      });
       Thread t2=new Thread(new Runnable() {
           @Override
           public void run() {
               synchronized (lock){
                   System.out.println("t2 executing...");
                   try {
                       TimeUnit.SECONDS.sleep(10);
                   }catch (Exception e){
                       e.printStackTrace();
                   }
               }
           }
       });
       System.out.println(t1.getState());
       System.out.println(t2.getState());
       t1.start();
       t2.start();
       System.out.println(t1.getState());
       System.out.println(t2.getState());
       TimeUnit.SECONDS.sleep(11);
       System.out.println(t1.getState());
       System.out.println(t2.getState());
       TimeUnit.SECONDS.sleep(11);
       System.out.println(t1.getState());
       System.out.println(t2.getState());
   }
}

来源:https://zhuanlan.zhihu.com/p/263013455

标签:Java,JVM,线程,状态
0
投稿

猜你喜欢

  • Easyui的combobox实现动态数据级联效果

    2022-02-15 07:26:13
  • c# 可选参数、命名参数

    2022-08-06 05:38:41
  • 全面分析Java文件上传

    2021-12-09 13:22:52
  • gradle使用maven-publish发布jar包上传到私有maven配置

    2022-11-22 07:07:54
  • Hibernate多对一单项关联

    2023-05-10 18:16:11
  • Android界面设计(APP设计趋势 左侧隐藏菜单右边显示content)

    2023-05-20 04:54:24
  • JPA如何设置表名和实体名,表字段与实体字段的对应

    2022-07-14 14:36:27
  • JAVA的Random类的用法详解

    2022-07-22 00:05:58
  • Android中的webview支持页面中的文件上传实例代码

    2023-12-27 06:44:17
  • C# log4net 日志输出的实现示例

    2023-04-27 06:50:12
  • 基于WPF实现绘制地铁路线图

    2023-09-08 13:23:12
  • Android SDK在线更新镜像服务器大全

    2023-03-14 05:44:27
  • java实现Object转String的4种方法小结

    2023-07-18 08:54:53
  • Java经典面试题最全汇总208道(三)

    2023-11-15 23:30:42
  • Android App使用RecyclerView实现上拉和下拉刷新的方法

    2023-03-28 17:47:20
  • C# 实现FTP客户端的小例子

    2022-06-09 13:19:13
  • Entity Framework映射TPH、TPT、TPC与继承类

    2022-10-18 04:52:52
  • Android获取ROOT权限的实例代码

    2022-09-10 01:24:05
  • java 查找字符串所在的位置代码

    2023-12-22 21:48:17
  • Java实现两人五子棋游戏(五) 判断是否有一方胜出

    2022-03-03 18:29:44
  • asp之家 软件编程 m.aspxhome.com