Java JVM中線程狀態(tài)詳解
前言:
在Java面試中,線程的狀態(tài)也是被經(jīng)常考察的知識點,今天我們就來聊一聊線程狀態(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源碼的注釋中詳細(xì)的描述了不同狀態(tài)之間在哪些條件下進(jìn)行轉(zhuǎn)換,本文中我用一個圖來進(jìn)行表示。 由于CPU的時間片輪轉(zhuǎn)機制,處于Runnable
狀態(tài)的線程可以分為兩種:Ready
(就緒)和Running
(運行)。因此,我們的狀態(tài)圖中有7種狀態(tài)節(jié)點。
如下圖:
上圖中展示了線程在不同狀態(tài)之間的轉(zhuǎn)換情況,在調(diào)用與線程有關(guān)的方法后,線程會進(jìn)入不同的線程狀態(tài),這些狀態(tài)之間某些是雙向的,比如WAITING和RUNNING之間可以循環(huán)的進(jìn)行切換。而有些是單向的,比如終止后不能再次進(jìn)入終止?fàn)顟B(tài)。
針對上面的圖,可以詢問的面試點有很多。比如線程的監(jiān)視器鎖機制、比如線程協(xié)同的機制等等,讀者要結(jié)合圖片仔細(xì)研究。最后是一個例子,展示了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)文章
Druid(新版starter)在SpringBoot下的使用教程
Druid是Java語言中最好的數(shù)據(jù)庫連接池,Druid能夠提供強大的監(jiān)控和擴展功能,DruidDataSource支持的數(shù)據(jù)庫,這篇文章主要介紹了Druid(新版starter)在SpringBoot下的使用,需要的朋友可以參考下2023-05-05Spring整合websocket整合應(yīng)用示例(下)
這篇文章主要介紹了Spring整合websocket整合應(yīng)用示例(下)的相關(guān)資料,需要的朋友可以參考下2016-04-04基于Java和GeoTools的Shapefile矢量數(shù)據(jù)縮略圖生成實踐
這篇文章主要介紹了基于Java和GeoTools的Shapefile矢量數(shù)據(jù)縮略圖生成實踐,需要的朋友可以參考下2024-08-08淺析Java進(jìn)制轉(zhuǎn)換、輸入、命名問題
這篇文章主要介紹了Java進(jìn)制轉(zhuǎn)換、輸入、命名問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07SpringBoot使用自定義注解實現(xiàn)權(quán)限攔截的示例
本篇文章主要介紹了SpringBoot使用自定義注解實現(xiàn)權(quán)限攔截的示例,具有一定的參考價值,有興趣的可以了解一下2017-09-09