Java JVM中線程狀態(tài)詳解
前言:
在Java面試中,線程的狀態(tài)也是被經(jīng)??疾斓闹R點,今天我們就來聊一聊線程狀態(tài)的那些事!
線程在JVM中的狀態(tài)
查看線程在JVM中有哪些不同的狀態(tài),最簡單的方式是查看Jdk源碼的Thread.State類。以下內(nèi)容來自JDK文檔。在JVM中,一個線程可能處于下面的六種狀態(tài)中的一種:
NEW
A thread that has not yet started is in this state. 沒有開始執(zhí)行的線程處于這種狀態(tài)
RUNNABLE
A thread executing in the Java virtual machine is in this state. 在JVM中執(zhí)行的線程處于這種狀態(tài)
BLOCKED
A thread that is blocked waiting for a monitor lock is in this state. 因為等待監(jiān)視器鎖而處于等待的線程處于這種狀態(tài)
WAITING
A thread that is waiting indefinitely for another thread to perform a particular action is in this state. 等待另一個線程執(zhí)行某些特別操作的線程處于這種狀態(tài)。補充:實際上,這個線程等待的條件稱為條件謂詞,這個線程等待的位置稱為條件隊列。來源大牛的書《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. 等待另一個線程執(zhí)行某些特別操作的線程(有時間限制)處于這種狀態(tài)
TERMINATED
A thread that has exited is in this state. 一個已經(jīng)執(zhí)行完畢的線程處于這種狀態(tài)
可見,一個線程在JVM中有6種不同的狀態(tài)。此處我想強調(diào)一下,這個線程在JVM中的狀態(tài),并不能反映操作系統(tǒng)級別的線程狀態(tài)。
線程在JVM中的狀態(tài)轉(zhuǎn)換
JDK源碼的注釋中詳細的描述了不同狀態(tài)之間在哪些條件下進行轉(zhuǎn)換,本文中我用一個圖來進行表示。 由于CPU的時間片輪轉(zhuǎn)機制,處于Runnable狀態(tài)的線程可以分為兩種:Ready(就緒)和Running(運行)。因此,我們的狀態(tài)圖中有7種狀態(tài)節(jié)點。
如下圖:

上圖中展示了線程在不同狀態(tài)之間的轉(zhuǎn)換情況,在調(diào)用與線程有關(guān)的方法后,線程會進入不同的線程狀態(tài),這些狀態(tài)之間某些是雙向的,比如WAITING和RUNNING之間可以循環(huán)的進行切換。而有些是單向的,比如終止后不能再次進入終止狀態(tài)。
針對上面的圖,可以詢問的面試點有很多。比如線程的監(jiān)視器鎖機制、比如線程協(xié)同的機制等等,讀者要結(jié)合圖片仔細研究。最后是一個例子,展示了5種線程狀態(tài)(除Waiting狀態(tài))。
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());
}
}到此這篇關(guān)于Java JVM中線程狀態(tài)詳解的文章就介紹到這了,更多相關(guān)JVM線程狀態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中char[] 和 String 類型占用字節(jié)大小問題
這篇文章主要介紹了Java中char[] 和 String 類型占用字節(jié)大小問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08
詳解Spring注解@Autowired的實現(xiàn)原理和使用方法
在使用Spring開發(fā)的時候,配置的方式主要有兩種,一種是xml的方式,另外一種是 java config的方式,在使用的過程中,我們使用最多的注解應該就是@Autowired注解了,所以本文就給大家講講@Autowired注解是如何使用和實現(xiàn)的,需要的朋友可以參考下2023-07-07
SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息的示例
這篇文章主要介紹了SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
Spring?MVC實現(xiàn)GET請求接收Date類型參數(shù)
這篇文章主要介紹了Spring?MVC實現(xiàn)GET請求接收Date類型參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
springboot登陸頁面圖片驗證碼簡單的web項目實現(xiàn)
這篇文章主要介紹了springboot登陸頁面圖片驗證碼簡單的web項目實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04

