bat面試題:現在有t1、t2、t3三個執行緒,你怎樣保證t2在t1執行完後執行,t3在t2執行完後執行?
這個執行緒問題通常會在第一輪或**面試階段被問到,目的是檢測你對」join」方法是否熟悉。這個多執行緒問題比較簡單,可以用join方法實現。
一、作用
thread類中的join方法的主要作用就是同步,它可以使得執行緒之間的並行執行變為序列執行。具體看**:
1public
class
jointest
1314}15
class
threadjointest extends thread
19@override
20public
void
run()24}
25 }
上面程式結果是先列印完小明執行緒,在列印小東線程;
上面注釋也大概說明了join方法的作用:在a執行緒中呼叫了b執行緒的join()方法時,表示只有當b執行緒執行完畢時,a執行緒才能繼續執行。注意,這裡呼叫的join方法是沒有傳參的,join方法其實也可以傳遞乙個引數給它的,具體看下面的簡單例子:
1public
class
jointest
1213}14
class
threadjointest extends thread
18@override
19public
void
run()23}
24 }
上面**結果是:程式執行前面10毫秒內列印的都是小明執行緒,10毫秒後,小明和小東程式交替列印。
所以,join方法中如果傳入引數,則表示這樣的意思:如果a執行緒中掉用b執行緒的join(10),則表示a執行緒會等待b執行緒執行10毫秒,10毫秒過後,a、b執行緒並行執行。需要注意的是,jdk規定,join(0)的意思不是a執行緒等待b執行緒0秒,而是a執行緒等待b執行緒無限時間,直到b執行緒執行完畢,即join(0)等價於join()。
二、join與start呼叫順序問題
上面的討論大概知道了join的作用了,那麼,如果 join在start前呼叫,會出現什麼後果呢?先看下面的測試結果
1public
class
jointest
1213}14
class
threadjointest extends thread
18@override
19public
void
run()23}
24 }
上面**執行結果是:小明和小東線程交替列印。
三、join方法實現原理
有了上面的例子,我們大概知道join方法的作用了,那麼,join方法實現的原理是什麼呢?
其實,join方法是通過呼叫執行緒的wait方法來達到同步的目的的。例如,a執行緒中呼叫了b執行緒的join方法,則相當於a執行緒呼叫了b執行緒的wait方法,在呼叫了b執行緒的wait方法後,a執行緒就會進入阻塞狀態,具體看下面的原始碼:
1public final synchronized void join(long
millis)
2throws interruptedexception 910
if (millis == 0
) 14 } else
20wait(delay);
21 now = system.currenttimemillis() - base;22
}23}24 }
從原始碼中可以看到:join方法的原理就是呼叫相應執行緒的wait方法進行等待操作的,例如a執行緒中呼叫了b執行緒的join方法,則相當於在a執行緒中呼叫了b執行緒的wait方法,當b執行緒執行完(或者到達等待時間),b執行緒會自動呼叫自身的notifyall方法喚醒a執行緒,從而達到同步的目的。
join的簡單總結
bat面試題 現在有t1 t2 t3三個執行緒,你怎樣保證t2在t1執行完後執行,t3在t2執行完後執行?這個執行緒問題通常會在第一輪或 面試階段被問到,目的是檢測你對 join 方法是否熟悉。這個多執行緒問題比較簡單,可以用join方法實現。一 作用 thread類中的join方法的主要作用就是同...
java 執行緒方法join的簡單總結
雖然關於討論執行緒join方法的部落格已經很多了,不過個人感覺挺多都討論得不夠全面,所以我覺得有必要對其進行乙個全面的總結。一 作用 thread類中的join方法的主要作用就是同步,它可以使得執行緒之間的並行執行變為序列執行。具體看 public classjointest class threa...
java 執行緒方法join的簡單總結
雖然關於討論執行緒join方法的部落格已經很多了,不過個人感覺挺多都討論得不夠全面,所以我覺得有必要對其進行乙個全面的總結。一 作用 thread類中的join方法的主要作用就是同步,它可以使得執行緒之間的並行執行變為序列執行。具體看 public class jointest class thre...