Java JVM中线程状态详解

 更新时间:2022年09月02日 09:14:39   作者:义臻  
这篇文章主要介绍了Java JVM中线程状态详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的朋友可以参考一下

前言:

在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种状态节点。

如下图:

上图中展示了线程在不同状态之间的转换情况,在调用与线程有关的方法后,线程会进入不同的线程状态,这些状态之间某些是双向的,比如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());
    }
}

到此这篇关于Java JVM中线程状态详解的文章就介绍到这了,更多相关JVM线程状态内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Druid(新版starter)在SpringBoot下的使用教程

    Druid(新版starter)在SpringBoot下的使用教程

    Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,DruidDataSource支持的数据库,这篇文章主要介绍了Druid(新版starter)在SpringBoot下的使用,需要的朋友可以参考下
    2023-05-05
  • Spring整合websocket整合应用示例(下)

    Spring整合websocket整合应用示例(下)

    这篇文章主要介绍了Spring整合websocket整合应用示例(下)的相关资料,需要的朋友可以参考下
    2016-04-04
  • 基于Java和GeoTools的Shapefile矢量数据缩略图生成实践

    基于Java和GeoTools的Shapefile矢量数据缩略图生成实践

    这篇文章主要介绍了基于Java和GeoTools的Shapefile矢量数据缩略图生成实践,需要的朋友可以参考下
    2024-08-08
  • Java设计模式之策略模式详细解析

    Java设计模式之策略模式详细解析

    这篇文章主要介绍了Java设计模式之策略模式详细解析,策略模式中,定义算法族,分别封装起来,让他们之间可以相互转化,此模式让算法的变化独立于使用算法的客户,需要的朋友可以参考下
    2023-11-11
  • Java设计模式之命令模式

    Java设计模式之命令模式

    这篇文章介绍了Java设计模式之命令模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Java线程变量ThreadLocal详细解读

    Java线程变量ThreadLocal详细解读

    这篇文章主要介绍了Java线程变量ThreadLocal详细解读,多线程访问同一个变量的时候,很容易出现问题,特别是多线程对一个共享变量进行写入的时候,为了线程的安全在进行数据写入时候会进行数据的同步,需要的朋友可以参考下
    2024-01-01
  • JAVA十大排序算法之基数排序详解

    JAVA十大排序算法之基数排序详解

    这篇文章主要介绍了java中的基数排序,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Java开发常用类库之Hutool详解

    Java开发常用类库之Hutool详解

    这篇文章主要介绍了Java开发常用类库之Hutool,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 浅析Java进制转换、输入、命名问题

    浅析Java进制转换、输入、命名问题

    这篇文章主要介绍了Java进制转换、输入、命名问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • SpringBoot使用自定义注解实现权限拦截的示例

    SpringBoot使用自定义注解实现权限拦截的示例

    本篇文章主要介绍了SpringBoot使用自定义注解实现权限拦截的示例,具有一定的参考价值,有兴趣的可以了解一下
    2017-09-09

最新评论