Java JVM中线程状态详解
作者:义臻 发布时间:2023-01-24 16:06:19
标签: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());
}
}
来源:https://zhuanlan.zhihu.com/p/263013455


猜你喜欢
- 前言今天来做个打方块的小游戏,继续熟悉kotlin的语法,更多关于kotlin的语法大家可以参考这篇文章:https://www.jb51.
- 一、项目简述功能: 用户分为患者,医生,管理员,患者可进行注册选择医生 挂号,选择日期,选择号源,医生可进行接诊,管理员可 对用户,医生信息
- 一、之前旧的写法class Singleton{ private Singleton() {} &nb
- Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion)。,它的语法形式有如下所示的两种
- 很多童鞋反应在吧项目导入到eclipse(myeclipse)时中文会有乱码,修改了编码格式后还是乱码,这里给大家介绍一下关于中文乱码时修改
- 一:背景1.讲故事前段时间分析了一个dump,一顿操作之后,我希望用外力来阻止程序内部对某一个com组件的调用,对,就是想借助外力实现,如果
- Java7 中 ConcurrentHashMapConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发
- maven打包方式使用maven打包插件maven-jar-plugin在pom.xml文件最后新增以下代码。maven-dependenc
- 效果视频简述本Demo采用Hilt+Retrofit+Paging3完成,主要为了演示paging3分页功能的使用,下列为Demo所需要的相
- AttributeUsage预定义特性AttributeUsage描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。规定该特
- 场景需要判断,首字母是否是英文字母。有人说,那还不简单么,StringUtils.isAlpha() 就可以搞定。 笔者也是这么想的,结果却
- 一、前言 做过系统参数设置的同学们,肯定遇到过要提供一系列具有相同特点的选项供用户选择。
- Java中普通代码块,构造代码块,静态代码块区别及代码示例//执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块
- 1、Java数组介绍在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型(Object类型数组除外)。①、数组的声明
- TransactionTemplate的使用总结:在类中注入TransactionTemplate,即可在springboot中使用编程式事
- 1、什么是 ThreadLocal:ThreadLocal,即线程本地变量,如果你创建了一个变量,那么访问这个变量的每个线程都会有这个变量的
- 本文实例讲述了Android提高Service优先级的方法。分享给大家供大家参考,具体如下:Android 系统对于内存管理有自己的一套方法
- 本文实例讲述了Java设计模式之工厂模式。分享给大家供大家参考,具体如下:一、 简单工厂先来思考一个问题。我们平时写程序时,会有这种情况,A
- 目录1、在java中,无论在何处调用,使用静态属性必须以类名做前缀。2、若有定义语句: int a=10 ; double b=3.14 ;
- 本文实例讲述了Java模拟QQ桌面截图功能实现方法。分享给大家供大家参考。具体如下:QQ的桌面截图功能非常方便,去年曾用Java模拟过一个,