在很多情況下,一個線程的輸出可能非常依賴于另外一個或者多個線程的資料。在這種情況下,這個線程就需要等待依賴線程執行完畢,才能繼續執行。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。
他表示會給其他重要的線程更多的執行機會