Java JVM中線程狀態(tài)詳解
前言:
在Java面試中,線程的狀態(tài)也是被經(jīng)??疾斓闹R(shí)點(diǎn),今天我們就來(lái)聊一聊線程狀態(tài)的那些事!
線程在JVM中的狀態(tài)
查看線程在JVM中有哪些不同的狀態(tài),最簡(jiǎn)單的方式是查看Jdk源碼的Thread.State類。以下內(nèi)容來(lái)自JDK文檔。在JVM中,一個(gè)線程可能處于下面的六種狀態(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. 因?yàn)榈却O(jiān)視器鎖而處于等待的線程處于這種狀態(tài)
WAITING
A thread that is waiting indefinitely for another thread to perform a particular action is in this state. 等待另一個(gè)線程執(zhí)行某些特別操作的線程處于這種狀態(tài)。補(bǔ)充:實(shí)際上,這個(gè)線程等待的條件稱為條件謂詞,這個(gè)線程等待的位置稱為條件隊(duì)列。來(lá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. 等待另一個(gè)線程執(zhí)行某些特別操作的線程(有時(shí)間限制)處于這種狀態(tài)
TERMINATED
A thread that has exited is in this state. 一個(gè)已經(jīng)執(zhí)行完畢的線程處于這種狀態(tài)
可見,一個(gè)線程在JVM中有6種不同的狀態(tài)。此處我想強(qiáng)調(diào)一下,這個(gè)線程在JVM中的狀態(tài),并不能反映操作系統(tǒng)級(jí)別的線程狀態(tài)。
線程在JVM中的狀態(tài)轉(zhuǎn)換
JDK源碼的注釋中詳細(xì)的描述了不同狀態(tài)之間在哪些條件下進(jìn)行轉(zhuǎn)換,本文中我用一個(gè)圖來(lái)進(jìn)行表示。 由于CPU的時(shí)間片輪轉(zhuǎn)機(jī)制,處于Runnable
狀態(tài)的線程可以分為兩種:Ready
(就緒)和Running
(運(yùn)行)。因此,我們的狀態(tài)圖中有7種狀態(tài)節(jié)點(diǎn)。
如下圖:
上圖中展示了線程在不同狀態(tài)之間的轉(zhuǎn)換情況,在調(diào)用與線程有關(guān)的方法后,線程會(huì)進(jìn)入不同的線程狀態(tài),這些狀態(tài)之間某些是雙向的,比如WAITING和RUNNING之間可以循環(huán)的進(jìn)行切換。而有些是單向的,比如終止后不能再次進(jìn)入終止?fàn)顟B(tài)。
針對(duì)上面的圖,可以詢問的面試點(diǎn)有很多。比如線程的監(jiān)視器鎖機(jī)制、比如線程協(xié)同的機(jī)制等等,讀者要結(jié)合圖片仔細(xì)研究。最后是一個(gè)例子,展示了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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Druid(新版starter)在SpringBoot下的使用教程
Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池,Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能,DruidDataSource支持的數(shù)據(jù)庫(kù),這篇文章主要介紹了Druid(新版starter)在SpringBoot下的使用,需要的朋友可以參考下2023-05-05Spring整合websocket整合應(yīng)用示例(下)
這篇文章主要介紹了Spring整合websocket整合應(yīng)用示例(下)的相關(guān)資料,需要的朋友可以參考下2016-04-04基于Java和GeoTools的Shapefile矢量數(shù)據(jù)縮略圖生成實(shí)踐
這篇文章主要介紹了基于Java和GeoTools的Shapefile矢量數(shù)據(jù)縮略圖生成實(shí)踐,需要的朋友可以參考下2024-08-08Java設(shè)計(jì)模式之策略模式詳細(xì)解析
這篇文章主要介紹了Java設(shè)計(jì)模式之策略模式詳細(xì)解析,策略模式中,定義算法族,分別封裝起來(lái),讓他們之間可以相互轉(zhuǎn)化,此模式讓算法的變化獨(dú)立于使用算法的客戶,需要的朋友可以參考下2023-11-11淺析Java進(jìn)制轉(zhuǎn)換、輸入、命名問題
這篇文章主要介紹了Java進(jìn)制轉(zhuǎn)換、輸入、命名問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07SpringBoot使用自定義注解實(shí)現(xiàn)權(quán)限攔截的示例
本篇文章主要介紹了SpringBoot使用自定義注解實(shí)現(xiàn)權(quán)限攔截的示例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09