Java?詳細(xì)講解線程的狀態(tài)及部分常用方法
可以通過(guò) Thread.getState 方法獲得線程的狀態(tài)(線程一共有 6 種狀態(tài))
NEW(新建)new:尚未啟動(dòng)
RUNNABLE(可運(yùn)行狀態(tài))runnable:正在 JVM 中運(yùn)行;或者正在等待操作系統(tǒng)的其他資源(比如處理器)
//有些編程語(yǔ)言會(huì)把RUNNABLE分成2種情況
//1.running
//2.ready
//以上2種在Java中都屬于RUNNABLE
BLOCKED(阻塞狀態(tài)) blocked:正在等待監(jiān)視器鎖(內(nèi)部鎖)
WAITING(等待狀態(tài)) waiting:在等待另一個(gè)線程
調(diào)用以下方法會(huì)處于等待狀態(tài)
沒(méi)有超時(shí)值的 Object.wait
沒(méi)有超時(shí)值的 Thread.join
LockSupport.park
//后續(xù)會(huì)詳細(xì)介紹
TIMED_WAITING(定時(shí)等待狀態(tài)) timed_waiting
調(diào)用以下方法會(huì)處于定時(shí)等待狀態(tài)
Thread.sleep
有超時(shí)值的 Object.wait
有超時(shí)值的 Thread.join
LockSupport.parkNanos
LockSupport.parkUnti
//后續(xù)會(huì)詳細(xì)介紹
TERMINATED(終止?fàn)顟B(tài)):已經(jīng)執(zhí)行完畢
部分實(shí)例:
public class Main {
public static void main(String[] a) {
Thread dangqian = Thread.currentThread();//獲取主線程
System.out.println(dangqian.getState());//輸出RUNNABLE
//表示主線程正處于RUNNABLE狀態(tài)
Thread tj = new Thread();//新建1個(gè)線程
System.out.println(tj.getState());//輸出NEW
Thread tj1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("ACM");
}
});
tj1.start();
//啟動(dòng)執(zhí)行完run方法后線程終止 此時(shí)處于TERMINATED狀態(tài)
}
}- sleep interrupt 介紹
可以通過(guò) Thread.sleep 方法暫停當(dāng)前線程,進(jìn)入WAITING狀態(tài)
在暫停期間,若調(diào)用線程對(duì)象的 interrupt 方法中斷線程,會(huì)拋出 java.lang.InterruptedException 異常
實(shí)例(注釋)介紹更為明了:
public class Main {
public static void main(String[] a) {
Thread tj = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("1");
try {
Thread.sleep(3000);//sleep是靜態(tài)方法,所以通過(guò)類(lèi)名來(lái)調(diào)用;讓線程睡3s
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2");
}
});
tj.start();
//因?yàn)槭嵌嗑€程,在執(zhí)行tj線程時(shí),主線程依然往下走
try {
Thread.sleep(1000);//讓主線程睡1s
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("3");
//由于tj線程睡得較久,所以先打印3,再打印2
tj.interrupt();//中斷此線程,但實(shí)際上只是給線程設(shè)置一個(gè)中斷標(biāo)志,線程仍會(huì)執(zhí)行;在這里用于觸發(fā)異常
}
}輸出:
1
3
2
- join isAlive 介紹
A.join 方法:等線程 A 執(zhí)行完畢后,當(dāng)前線程再繼續(xù)執(zhí)行任務(wù)。可以傳參指定最長(zhǎng)等待時(shí)間
A.isAlive 方法:查看線程 A 是否還活著
實(shí)例:
public class Main {
public static void main(String[] a) {
Thread tj = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("1");
try {
Thread.sleep(3000);//sleep是靜態(tài)方法,所以通過(guò)類(lèi)名來(lái)調(diào)用;讓線程睡3s
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2");
}
});
tj.start();
System.out.println(tj.isAlive());//此時(shí)3s未過(guò),tj線程仍在執(zhí)行;所以輸出true
try {
tj.join();//等tj線程執(zhí)行完畢再往下執(zhí)行
//tj.join(1000); 等待tj線程1s再往下執(zhí)行
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("3");
System.out.println(tj.getState());
System.out.println(tj.isAlive());//tj線程已執(zhí)行完畢;所以輸出false
}
}輸出:
true
1
2
3
TERMINATED
false
到此這篇關(guān)于Java 詳細(xì)講解線程的狀態(tài)及部分常用方法的文章就介紹到這了,更多相關(guān)Java 線程的狀態(tài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談springioc實(shí)例化bean的三個(gè)方法
下面小編就為大家?guī)?lái)一篇淺談springioc實(shí)例化bean的三個(gè)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就想給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
Android 資源 id詳解及的動(dòng)態(tài)獲取
這篇文章主要介紹了Android 資源 id詳解及的動(dòng)態(tài)獲取的相關(guān)資料,需要的朋友可以參考下2016-12-12
mybatis的mapper.xml中resultMap標(biāo)簽的使用詳解
這篇文章主要介紹了mybatis的mapper.xml中resultMap標(biāo)簽的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java連接MYSQL數(shù)據(jù)庫(kù)的實(shí)現(xiàn)步驟
以下的文章主要描述的是java連接MYSQL數(shù)據(jù)庫(kù)的正確操作步驟,在此篇文章里我們主要是以實(shí)例列舉的方式來(lái)引出其具體介紹2013-06-06
SpringBoot 2 統(tǒng)一異常處理過(guò)程解析
這篇文章主要介紹了SpringBoot 2 統(tǒng)一異常處理過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java中區(qū)別.toString() ,(String),valueOf()方法
這篇文章主要介紹了Java中區(qū)別.toString() ,(String),valueOf()方法,需要的朋友可以參考下2017-01-01

