Java線程生命周期圖文詳細講解
更新時間:2023年01月27日 10:58:44 作者:健鑫.
在java中,任何對象都要有生命周期,線程也不例外,它也有自己的生命周期。線程的整個生命周期可以分為5個階段,分別是新建狀態(tài)、就緒狀態(tài)、運行狀態(tài)、阻塞狀態(tài)和死亡狀態(tài)
線程的狀態(tài)

New
- 表示線程已創(chuàng)建,沒啟動的狀態(tài)
- 此時已經(jīng)做了一些準備工作,還沒有執(zhí)行run方法中代碼
Runnable
- 調(diào)用start方法之后的狀態(tài),表示可運行狀態(tài)(不一定正在運行,因為調(diào)用start方法之后不一定立即運行)
- 如果線程拿到CPU資源,但是突然資源被搶走,這個線程依然處于Runnable
Blocked
- 線程進入到被synchronized修飾的代碼塊時,該鎖已經(jīng)被其他線程拿走,此時該線程處于Blocked
- Blocked只針對synchronized
Waiting
- 沒有設(shè)置時間參數(shù)的Object.wait方法可使線程狀態(tài)變?yōu)閣aiting
Timed Waiting
- 相對Waiting,有了時間參數(shù)
Terminated
- 執(zhí)行完畢
- run方法正常執(zhí)行完畢
- 或者出現(xiàn)了一個沒有被捕獲的異常終止了run方法
代碼演示
- 展示線程的New、Runnable、Terminated狀態(tài)
- 線程剛被new處于NEW狀態(tài)
- 調(diào)用start方法處于RUNNABLE狀態(tài)
- 程序正在執(zhí)行處于RUNNABLE狀態(tài)而不是RUNNING
- 程序結(jié)束處于TERMINATED狀態(tài)
public class NewRunnableTerminated implements Runnable {
public static void main(String[] args) {
Thread thread = new Thread(new NewRunnableTerminated());
// 打印線程狀態(tài)
// New
System.out.println(thread.getState());
thread.start();
// Runnable
System.out.println(thread.getState());
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// Runnable
System.out.println(thread.getState());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// TERMINATED
System.out.println(thread.getState());
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println(i);
}
}
}
/*
* NEW
RUNNABLE
RUNNABLE
* TERMINATED
* */
- 演示waiting、Blocked、Timed Waiting
- 中間頻繁調(diào)用sleep方法是防止代碼執(zhí)行太快,達不到應有的效果
- 線程被調(diào)用sleep,處于TIMED_WAITING
- 當一個線程執(zhí)行synchronized內(nèi)的代碼,另一個線程也要執(zhí)行則該線程處于BLOCKED
- 線程執(zhí)行wait方法,處于WAITING
public class BlockWaitingTimedWaiting implements Runnable{
public static void main(String[] args) {
BlockWaitingTimedWaiting blockWaitingTimedWaiting = new BlockWaitingTimedWaiting();
Thread thread1 = new Thread(blockWaitingTimedWaiting);
thread1.start();
Thread thread2 = new Thread(blockWaitingTimedWaiting);
thread2.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread1.getState());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread2.getState());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread1.getState());
}
@Override
public void run() {
syn();
}
private synchronized void syn() {
try {
Thread.sleep(1000);
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*
* TIMED_WAITING
BLOCKED
WAITING
* */
阻塞狀態(tài)
- 一般而言,Blocked、Waiting、Timed_waiting都被稱之為阻塞狀態(tài)
- 在阻塞狀態(tài)下,什么時候可以繼續(xù)執(zhí)行是不受控制的
到此這篇關(guān)于Java線程生命周期圖文詳細講解的文章就介紹到這了,更多相關(guān)Java線程生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Spring自定義XML schema 擴展的問題(Spring面試高頻題)
今天給大家分享一道spring高頻率面試題關(guān)于Spring自定義XML schema 擴展的問題,今天以spring整合dubbo的實例給大家詳細講解下,感興趣的朋友跟隨小編一起看看吧2021-05-05
Java編程生產(chǎn)者消費者實現(xiàn)的四種方法
Java生產(chǎn)者和消費者問題是線程安全模型中的經(jīng)典問題:生產(chǎn)者和消費者在同一個時間段共用同一個存儲空間,生產(chǎn)者向存儲空間中添加產(chǎn)品呢,消費者取走產(chǎn)品,當存儲空間為空時,消費者阻塞,當存儲空間滿時,生產(chǎn)者阻塞2021-10-10
Java詳細分析講解自動裝箱自動拆箱與Integer緩存的使用
裝箱就是把基本類型轉(zhuǎn)換成包裝類,拆箱就是把包裝類轉(zhuǎn)換成基本類型,下面這篇文章主要給大家介紹Java中自動裝箱、自動拆箱與Integer緩存,需要的朋友可以參考下2022-04-04

