在實際開發中我們往往會遇到這樣的情況乙個執行緒的執行需要依賴另乙個執行緒執行後的結果。即主線程生成並起動了子執行緒,如果子執行緒裡要進行大量的耗時的運算,主線程往往將於子執行緒之前結束,但是如果主線程處理完其他的事務後,需要用到子執行緒的處理結果,也就是主線程需要等待子執行緒執行完成之後再結束,這個時候就要用到join()方法了。
join() 方法主要是讓呼叫該方法的thread完成run方法裡面的任務後, 再執行join()方法後面的代。
主線程生成並起動了子執行緒,而子執行緒裡要進行大量的耗時的運算(這裡可以借鑑下執行緒的作用),當主線程處理完其他的事務後,需要用到子執行緒的處理結果,這個時候就要用到join();方法了。
//該方法會無限等待,它會一直阻塞當前執行緒直到目標執行緒(呼叫該方法的執行緒)執行完畢。join() 0
//該方法需要給出最大等待時間,如果目標執行緒的執行時間超過給定的時間,那麼當前執行緒將不在等待目標執行緒執行結束而直接執行public final synchronized void join(long millis)throws interruptedexception{}
string str= = "進入"+thread.currentthread().getname()+"執行緒"1000="hello word"+"執行緒業務處理完畢"main執行緒處理業務開始system.out.println(thread.currentthread().getname()+"執行緒處理業務開始""獲取str值:"+
進入thread-0執行緒
獲取str值:null
thread-0執行緒業務處理完畢
執行**,貌似永遠都看不到str的值是"hello word",而每次都是null,原因很簡單的,因為在thread中的run方法中對str進行賦值操作前休眠了1秒,此時main執行緒中的system.out.println方法已經執行了,所以很難看到str的值是"hello word",為了看到str的值是"hello word",我們的乙個思路就是等thread執行結束之後,我們再執行system.out.println就可以了,這時候join方法的作用就顯現出來的,我們把上面的注釋**刪除注釋,然後執行,不管執行多少次,輸出的結果都是「hello word」,從這個例子中我們就可以看到join方法的作用,它能夠調節各個執行緒之間的執行順序,從而可以實現同步。
如果修改注釋的**為thread.join(100);則執行結果為:獲取str值:null ,因為主線程已經等不及了。
join()他讓呼叫執行緒在當前執行緒物件上進行等待當執行緒執行完畢後,被等待的執行緒會在推出前呼叫notifyall()方法通知所有的等待執行緒繼續執行。
public final synchronized void join(long millis) throws interruptedexception if (millis == 0)} else
wait(delay);
now = system.currenttimemillis() - base;}}
}
Java執行緒的join 方法
join 把指定的執行緒加入到當前執行緒,可以將兩個交替執行的執行緒合併為順序執行的執行緒。比如在主線程中呼叫了執行緒a的join 方法 a.join 則直到執行緒a執行完畢後,才會繼續執行執行緒主線程。t.join 等待執行緒 t 執行完畢,再執行呼叫t執行緒方法的執行緒。大概就是這個意思 t.j...
Java執行緒Join方法介紹
thread類中的join方法的主要作用就是同步,它可以使得執行緒之間的並行執行變為序列執行。public class test1 class testthreadjoin extends thread public testthreadjoin string name public void ru...
java 多執行緒之join 方法
join 方法作用 阻塞執行緒,即等同於主線程進入子執行緒的wait 方法,等待子執行緒執行完,喚醒主線程才能繼續執行,子執行緒join到主線程。join 只阻塞主線程,若執行緒中有其他執行緒,仍然是並行狀態 如 main是主線程,在main中建立了thread執行緒,在main中呼叫了thread...