天天看點

《并發程式設計》--5.線程等待結束(join)和線程謙讓(yield)

在很多情況下,一個線程的輸出可能非常依賴于另外一個或者多個線程的資料。在這種情況下,這個線程就需要等待依賴線程執行完畢,才能繼續執行。jdk就給我們提供了join()這個方法。

public final void join() throws InterruptedException;
           
public final synchronized void join(long millis) throws InterruptedException
           

第一個方法表示無限等待,他會一直阻塞目前線程,直至目标線程執行完畢,目前線程才能繼續執行

第二個方法是設定最大的等待時間,如果超過這個時間将不會繼續等待

以後提供一個demo友善了解

public class join {
	public volatile static int i = 0;
	public static class addThread extends Thread{
		@Override
		public void run(){
			for(int i = 0;i<999999999;i++);
		}
	}
	public static void main(String[] args) throws InterruptedException{
		addThread at = new addThread();
		at.start();
		at.join();//若不使用join,主函數會資料一個很小的數字,甚至是0
		          //使用後表示願意等待addThread執行完畢
		System.out.println(i);
	}
}
           

其實join的核心代碼就是

while(isAived){
		wait(0);
	}
           

當其他線程執行完畢,或者超過等待時間将會執行notity方法。

public static native void yield();
           

yield是一個靜态的方法,如果一個線程不是那麼的重要,或者優先級特别的低,并且希望他不要占用太多的cpu,就可以在适當的地方調用thread.yield。

他表示會給其他重要的線程更多的執行機會