Java中join、sleep、wait、yield淺析

Join方法

join方法的功能就是使異步執行的線程變成同步執行。也就是說,當調用線程實例的start方法後,這個方法會立即返回,如果在調用start方法後後需要使用一個由這個線程計算得到的值,就必須使用join方法。如果不使用join方法,就不能保證當執行到start方法後面的某條語句時,這個線程一定會執行完。而使用join方法後,直到這個線程退出,程序纔會往下執行。主線程生成並起動了子線程,主線程等待子線程的終止。也就是在子線程調用了join()方法後面的代碼,只有等到子線程結束了才能執行。

示例:

public class ThreadTest implements Runnable {
	public static int a = 0;
	public synchronized void inc() {
		a++;
	}
	public void run() {
		for (int i = 0; i < 5; i++) {
			inc();
		}
	}

	public static void main(String[] args) throws Exception {
		Runnable r = new ThreadTest();
		Thread t1 = new Thread(r);
		t1.start();
		t1.join();
		System.out.println(a);
	}
}

結果:5。Main線程必須等待t1線程執行完畢後才能繼續執行。

sleep方法

在指定時間內讓當前正在執行的線程暫停執行,但不會釋放“鎖標誌”。不推薦使用。

sleep使當前線程進入阻塞狀態,在指定時間內不會執行。

wait方法

在其他線程調用對象的notify或notifyAll方法前,導致當前線程等待。線程會釋放掉它所佔有的“鎖標誌”,從而使別的線程有機會搶佔該鎖。

當前線程必須擁有當前對象鎖。如果當前線程不是此鎖的擁有者,會拋出IllegalMonitorStateException異常。

喚醒當前對象鎖的等待線程使用notify或notifyAll方法,也必須擁有相同的對象鎖,否則也會拋出IllegalMonitorStateException異常。

waite() 和notify()必須在synchronized函數或synchronized block中進行調用。如果在non-synchronized函數或non-synchronized block中進行調用,雖然能編譯通過,但在運行時會發生 IllegalMonitorStateException的異常。

yield方法

暫停當前正在執行的線程對象。

yield()只是使當前線程重新回到可執行狀態,所以執行yield()的線程有可能在進入到可執行狀態後馬上又被執行。

yield()只能使同優先級或更高優先級的線程有執行的機會。


以上內容整理自互聯網
發佈了8 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章