JVM线程状态
义臻 人气:0前言:
在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()); } }
加载全部内容