首頁 > 軟體

Java 詳細講解執行緒的狀態及部分常用方法

2022-04-14 13:03:29

可以通過 Thread.getState 方法獲得執行緒的狀態(執行緒一共有 6 種狀態)

NEW(新建)new:尚未啟動

RUNNABLE(可執行狀態)runnable:正在 JVM 中執行;或者正在等待作業系統的其他資源(比如處理器)

//有些程式語言會把RUNNABLE分成2種情況
//1.running
//2.ready
//以上2種在Java中都屬於RUNNABLE

BLOCKED(阻塞狀態) blocked:正在等待監視器鎖(內部鎖)

WAITING(等待狀態) waiting:在等待另一個執行緒

呼叫以下方法會處於等待狀態

沒有超時值的 Object.wait

沒有超時值的 Thread.join

LockSupport.park

//後續會詳細介紹

TIMED_WAITING(定時等待狀態) timed_waiting

呼叫以下方法會處於定時等待狀態

Thread.sleep

有超時值的 Object.wait

有超時值的 Thread.join

LockSupport.parkNanos

LockSupport.parkUnti

//後續會詳細介紹

TERMINATED(終止狀態):已經執行完畢

部分範例:

public class Main {
	public static void main(String[] a) {
		Thread dangqian = Thread.currentThread();//獲取主執行緒
		System.out.println(dangqian.getState());//輸出RUNNABLE
		//表示主執行緒正處於RUNNABLE狀態
		
		Thread tj = new Thread();//新建1個執行緒
		System.out.println(tj.getState());//輸出NEW
		
		Thread tj1 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("ACM");
			}
		});
		tj1.start();
		//啟動執行完run方法後執行緒終止 此時處於TERMINATED狀態
	}
}
  • sleep   interrupt 介紹

可以通過 Thread.sleep 方法暫停當前執行緒,進入WAITING狀態

在暫停期間,若呼叫執行緒物件的 interrupt 方法中斷執行緒,會丟擲 java.lang.InterruptedException 異常

範例(註釋)介紹更為明瞭: 

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是靜態方法,所以通過類名來呼叫;讓執行緒睡3s
				}catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("2");
			}
		});
		tj.start();
		//因為是多執行緒,在執行tj執行緒時,主執行緒依然往下走
		try {
			Thread.sleep(1000);//讓主執行緒睡1s
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("3");
		//由於tj執行緒睡得較久,所以先列印3,再列印2
		tj.interrupt();//中斷此執行緒,但實際上只是給執行緒設定一箇中斷標誌,執行緒仍會執行;在這裡用於觸發異常
	}
}

輸出:

1
3
2

  • join  isAlive  介紹

A.join 方法:等執行緒 A 執行完畢後,當前執行緒再繼續執行任務。可以傳參指定最長等待時間

A.isAlive 方法:檢視執行緒 A 是否還活著

範例:

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是靜態方法,所以通過類名來呼叫;讓執行緒睡3s
				}catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("2");
			}
		});
		tj.start();
		System.out.println(tj.isAlive());//此時3s未過,tj執行緒仍在執行;所以輸出true
		try {
			tj.join();//等tj執行緒執行完畢再往下執行
			//tj.join(1000); 等待tj執行緒1s再往下執行
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("3");
	    System.out.println(tj.getState());
	    System.out.println(tj.isAlive());//tj執行緒已執行完畢;所以輸出false
	}
}

輸出:

true
1
2
3
TERMINATED
false

到此這篇關於Java 詳細講解執行緒的狀態及部分常用方法的文章就介紹到這了,更多相關Java 執行緒的狀態內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com