1. 程式人生 > >java主執行緒等待所有子執行緒執行完畢在執行(常見面試題)

java主執行緒等待所有子執行緒執行完畢在執行(常見面試題)

java主執行緒等待所有子執行緒執行完畢在執行,這個需求其實我們在工作中經常會用到,比如使用者下單一個產品,後臺會做一系列的處理,為了提高效率,每個處理都可以用一個執行緒來執行,所有處理完成了之後才會返回給使用者下單成功,下面就說一下我能想到的方法,歡迎大家批評指正:

1. sleep

sleep方法,讓主執行緒睡眠一段時間,當然這個睡眠時間是主觀的時間,是我們自己定的,這個方法不推薦,但是在這裡還是寫一下,畢竟是解決方法

在這裡插入圖片描述

2.join()

使用Thread的join()等待所有的子執行緒執行完畢,主執行緒在執行,thread.join()把指定的執行緒加入到當前執行緒,可以將兩個交替執行的執行緒合併為順序執行的執行緒。比如線上程B中呼叫了執行緒A的Join()方法,直到執行緒A執行完畢後,才會繼續執行執行緒B。

在這裡插入圖片描述

下面結合這個問題我介紹一些併發包裡非常有用的併發工具類

3.等待多執行緒完成的CountDownLatch

在這裡插入圖片描述

在這裡說明一點,countDownLatch不可能重新初始化或者修改CountDownLatch物件內部計數器的值,一個執行緒呼叫countdown方法happen-before另外一個執行緒呼叫await方法

4.同步屏障CyclicBarrier

在這裡插入圖片描述

寫到這裡大家不免有些疑問,countDownLatchcyclicBarrier有什麼區別呢,他們的區別:countDownLatch只能使用一次,而CyclicBarrier方法可以使用reset()方法重置,所以CyclicBarrier方法

可以能處理更為複雜的業務場景。

我曾經在網上看到一個關於countDownLatch和cyclicBarrier的形象比喻,就是在百米賽跑的比賽中若使用 countDownLatch的話衝過終點線一個人就給評委傳送一個人的成績,10個人比賽傳送10次,如果用CyclicBarrier,則只在最後一個人衝過終點線的時候傳送所有人的資料,僅僅傳送一次,這就是區別。

好了就寫到這裡,別的方法暫時沒有想到,歡迎拍磚,如果覺得我的文章對你有幫助,請關注,謝謝