Thread 類的基本用法、Java 線程的幾種狀態(tài)分析
在Java中,Thread類是多線程編程的核心。
線程創(chuàng)建 (Thread Creation)
- 創(chuàng)建線程主要有兩種邏輯:繼承Thread類或?qū)崿F(xiàn)Runnable接口。
- 方式1:繼承 Thread 類,重寫(xiě)run()
// 自定義線程類繼承Thread
class MyThread extends Thread {
// 重寫(xiě)run(),定義線程執(zhí)行邏輯
@Override
public void run() {
System.out.println("子線程執(zhí)行:" + Thread.currentThread().getName());
}
}
// 使用
public class Demo {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start(); // 3. 調(diào)用start()啟動(dòng)線程(不能直接調(diào)用run())
}
}
- 方式2:實(shí)現(xiàn)Runnable接口,傳給Thread
// 實(shí)現(xiàn)Runnable接口
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("子線程執(zhí)行:" + Thread.currentThread().getName());
}
}
// 使用
public class Demo {
public static void main(String[] args) {
// 把Runnable實(shí)例傳給Thread
Thread t = new Thread(new MyRunnable());
t.start(); // 啟動(dòng)線程
}
}
線程中斷 (Thread Interruption)
- 線程中斷不是強(qiáng)制停止線程,而是一種協(xié)作機(jī)制,即給線程發(fā)一個(gè)“請(qǐng)停止”的信號(hào)。
- void interrupt():標(biāo)記線程為 “中斷狀態(tài)”
- boolean isInterrupted():判斷線程是否處于中斷狀態(tài)
- 若線程在sleep/wait/join時(shí)被中斷,會(huì)拋出InterruptedException,且中斷狀態(tài)會(huì)被清除
Thread t = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) { // 檢測(cè)中斷狀態(tài)
System.out.println("線程運(yùn)行中...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// 捕獲中斷異常后,中斷狀態(tài)會(huì)被清除,需手動(dòng)終止循環(huán)
System.out.println("線程被中斷");
Thread.currentThread().interrupt(); // 重新標(biāo)記中斷(可選)
break;
}
}
});
t.start();
// 主線程1秒后中斷子線程
Thread.sleep(1000);
t.interrupt();
線程等待 (Thread Join)
- 有時(shí)主線程需要等待子線程執(zhí)行完畢后再繼續(xù)執(zhí)行,這時(shí)可以使用join()。
- t.join():當(dāng)前線程會(huì)進(jìn)入阻塞狀態(tài),直到線程t執(zhí)行結(jié)束。
- 帶參數(shù)的 join(long millis):設(shè)置最大等待時(shí)間,如果超時(shí)線程還沒(méi)結(jié)束,當(dāng)前線程就不再等待。
Thread t = new Thread(() -> {
System.out.println("子線程開(kāi)始執(zhí)行");
try { Thread.sleep(2000); } catch (InterruptedException e) {}
System.out.println("子線程執(zhí)行完畢");
});
t.start();
// 主線程等待t執(zhí)行完(最多等3秒)
t.join(3000);
System.out.println("主線程繼續(xù)執(zhí)行");
線程休眠 (Thread Sleep)
- static void sleep(long millis):讓當(dāng)前線程暫停指定時(shí)間(不會(huì)釋放鎖),拋出InterruptedException
System.out.println("開(kāi)始休眠");
try {
Thread.sleep(2000); // 當(dāng)前線程休眠2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("休眠結(jié)束");
獲取線程實(shí)例 (Get Current Instance)
- 在編寫(xiě)通用代碼(尤其是 Runnable 中)時(shí),常需要知道是誰(shuí)在運(yùn)行。
- Thread.currentThread():返回代碼當(dāng)前正在執(zhí)行的那個(gè)線程對(duì)象的引用。
- 常用操作:獲取線程 ID (getId())、獲取線程名稱 (getName()) 等。
// 獲取當(dāng)前線程(這里是main線程)
Thread mainThread = Thread.currentThread();
System.out.println("當(dāng)前線程名:" + mainThread.getName()); // 輸出"main"
// 子線程實(shí)例
Thread t = new Thread(() -> {
Thread current = Thread.currentThread();
System.out.println("子線程名:" + current.getName()); // 輸出"Thread-0"
});
t.start();
Java線程的幾種狀態(tài)
線程狀態(tài)一共有幾種?
- Java線程共有6種狀態(tài):
- NEW (新建)
- RUNNABLE (可運(yùn)行)
- BLOCKED (阻塞)
- WAITING (等待)
- TIMED_WAITING (超時(shí)等待)
- TERMINATED (終止)
每種狀態(tài)的含義與切換條件
- NEW (新建)
- 含義:創(chuàng)建了線程對(duì)象(new Thread()),但尚未調(diào)用 start() 方法。
- 切換:調(diào)用 start() 方法后,進(jìn)入 RUNNABLE 狀態(tài)。
- RUNNABLE (可運(yùn)行)
- 含義:Java 將操作系統(tǒng)中的“就緒(Ready)”和“運(yùn)行中(Running)”兩種狀態(tài)統(tǒng)稱為 RUNNABLE。處于該狀態(tài)的線程可能正在 CPU 上執(zhí)行,也可能正在等待操作系統(tǒng)分配時(shí)間片。
- 切換:
- 就緒 -> 運(yùn)行:獲得 CPU 時(shí)間片。
- 運(yùn)行 -> 就緒:CPU 時(shí)間片用完,或主動(dòng)調(diào)用 Thread.yield()。
- BLOCKED (阻塞)
- 含義:線程正在等待獲取一個(gè)排他鎖(如進(jìn)入synchronized 代碼塊/方法),但該鎖目前被其他線程持有。
- 切換:
- RUNNABLE -> BLOCKED:嘗試進(jìn)入 synchronized 區(qū)域失敗。
- BLOCKED -> RUNNABLE:其他線程釋放鎖,當(dāng)前線程成功競(jìng)爭(zhēng)到鎖。
- WAITING (等待)
- 含義:線程處于無(wú)限期的等待狀態(tài),不會(huì)被分配 CPU 時(shí)間,必須等待其他線程顯式地喚醒。
- 切換:
- RUNNABLE -> WAITING:調(diào)用 Object.wait()(不帶參數(shù))、Thread.join()(不帶參數(shù))或 LockSupport.park()。
- WAITING -> RUNNABLE:其他線程調(diào)用 Object.notify()、notifyAll() 或 LockSupport.unpark()。
- TIMED_WAITING (超時(shí)等待)
- 含義:與 WAITING 類似,但在指定的時(shí)間后會(huì)自動(dòng)喚醒,不需要其他線程顯式喚醒。
- 切換:
- RUNNABLE -> TIMED_WAITING:調(diào)用 Thread.sleep(ms)、Object.wait(ms)、Thread.join(ms) 等帶時(shí)間參數(shù)的方法。
- TIMED_WAITING -> RUNNABLE:時(shí)間結(jié)束,或被提前喚醒(如 notify())。
- TERMINATED (終止)
- 含義:線程已經(jīng)執(zhí)行完畢(run() 方法正常結(jié)束)或因異常退出了執(zhí)行。
- 切換:線程一旦進(jìn)入此狀態(tài),生命周期結(jié)束,不可再次啟動(dòng)(再次調(diào)用 start() 會(huì)拋出異常)。
到此這篇關(guān)于Thread 類的基本用法、Java 線程的幾種狀態(tài)分析的文章就介紹到這了,更多相關(guān)Java Thread 類用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot單元測(cè)試中@SpyBean使用小結(jié)
本文主要介紹了SpringBoot單元測(cè)試中@SpyBean使用小結(jié),@SpyBean用于部分模擬SpringBean,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
使用@RequestBody配合@Valid校驗(yàn)入?yún)?shù)
這篇文章主要介紹了使用@RequestBody配合@Valid校驗(yàn)入?yún)?shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Spring Cloud詳解實(shí)現(xiàn)聲明式微服務(wù)調(diào)用OpenFeign方法
這篇文章主要介紹了Spring Cloud實(shí)現(xiàn)聲明式微服務(wù)調(diào)用OpenFeign方法,OpenFeign 是 Spring Cloud 家族的一個(gè)成員, 它最核心的作用是為 HTTP 形式的 Rest API 提供了非常簡(jiǎn)潔高效的 RPC 調(diào)用方式,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2022-07-07
request.getParameter()方法的簡(jiǎn)單理解與運(yùn)用方式
在JavaWeb開(kāi)發(fā)中,request對(duì)象扮演著至關(guān)重要的角色,它是HTTP請(qǐng)求的封裝,request.getParameter()用于獲取客戶端通過(guò)GET或POST方式發(fā)送的參數(shù),與之相對(duì),request.setAttribute()用于在服務(wù)器端設(shè)置屬性,這些屬性只在一次請(qǐng)求中有效2024-10-10
SpringCloud?LoadBalancerClient?負(fù)載均衡原理解析
LoadBalancerClient?是?SpringCloud?提供的一種負(fù)載均衡客戶端,Ribbon?負(fù)載均衡組件內(nèi)部也是集成了?LoadBalancerClient?來(lái)實(shí)現(xiàn)負(fù)載均衡,本文給大家深入解析?LoadBalancerClient?接口源碼,感興趣的朋友跟隨小編一起看看吧2022-02-02
SSM框架下如何實(shí)現(xiàn)數(shù)據(jù)從后臺(tái)傳輸?shù)角芭_(tái)
這篇文章主要介紹了SSM框架下如何實(shí)現(xiàn)數(shù)據(jù)從后臺(tái)傳輸?shù)角芭_(tái),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
詳解JAVA 設(shè)計(jì)模式之狀態(tài)模式
這篇文章主要介紹了JAVA 狀態(tài)模式的的相關(guān)資料,文中講解的非常細(xì)致,幫助大家更好的學(xué)習(xí)理解JAVA 設(shè)計(jì)模式,感興趣的朋友可以了解下2020-06-06
java實(shí)現(xiàn)簡(jiǎn)單的推箱子小游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
java中利用List的subList方法實(shí)現(xiàn)對(duì)List分頁(yè)(簡(jiǎn)單易學(xué))
本篇文章主要介紹了java中l(wèi)ist數(shù)據(jù)拆分為sublist實(shí)現(xiàn)頁(yè)面分頁(yè)的簡(jiǎn)單代碼,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11

