首頁 > Java > java教程 > Java 執行緒的狀態與常用方法分析及範例

Java 執行緒的狀態與常用方法分析及範例

王林
發布: 2023-04-21 13:04:08
轉載
1481 人瀏覽過

可以透過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 執行緒的狀態與常用方法分析及範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板