12.31 面試官:如何讓線程順序執行,join,還有其他辦法嗎?

面試官:如讓線程順序執行?

我:使用Thread的join方法。

面試官:除了join還有別的辦法嗎?

我:目前只用過join。

面試官:哦,那你瞭解CountDownLatch嗎?

我:不瞭解,沒使用過。

面試中被問到線程順序執行,相信大家都能答出來join,但是除了join還有其他的辦法,不知道大家瞭解不。我這裡分享下3種方式。

第一種:join

面試官:如何讓線程順序執行,join,還有其他辦法嗎?

join方式

第二種:線程池

通過Executors.newSingleThreadExecutor()來實現(這裡可以看我的《面試官問你java都有哪些線程池,自己是否自定義過線程池》)

面試官:如何讓線程順序執行,join,還有其他辦法嗎?

線程池

第三種:通過CountDownLatch實現

面試官:如何讓線程順序執行,join,還有其他辦法嗎?

CountDownLatch

這3種方式哪種比較好,我個人認為還是CountDownLatch,因為他的粒度更細,比如我上面的例子,t2線程執行一半,t3線程就可以執行,通過join和線程池都實現不了。而通過

CountDownLatch可以實現,如圖:

面試官:如何讓線程順序執行,join,還有其他辦法嗎?

CountDownLatch細粒度

總結:

選擇使用什麼樣的方式,取決於你的需求,如果你只是想順序的執行那join和線程池都可以使用,因為這2種方式比較簡單。如果需求是細粒度的,比如線程1執行到某個部分,線程2就得執行,就使用CountDownLatch。但是使用它時,一定要理清邏輯,不然可能await方法會阻塞。


分享到:


相關文章: