溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java線程的狀態(tài)及常用方法實(shí)例分析

發(fā)布時(shí)間:2022-04-14 13:47:50 來(lái)源:億速云 閱讀:127 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了Java線程的狀態(tài)及常用方法實(shí)例分析的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Java線程的狀態(tài)及常用方法實(shí)例分析文章都會(huì)有所收獲,下面我們一起來(lá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ù)??梢詡鲄⒅付ㄗ铋L(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線程的狀態(tài)及常用方法實(shí)例分析”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Java線程的狀態(tài)及常用方法實(shí)例分析”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI