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

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

我們 工具 -1 cap 比賽 div 20px caption 常見

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

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

  1. 用sleep方法,讓主線程睡眠一段時間,當然這個睡眠時間是主觀的時間,是我們自己定的,這個方法不推薦,但是在這裏還是寫一下,畢竟是解決方法

技術分享


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

技術分享


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

3.等待多線程完成的CountDownLatch

技術分享


在這裏說明一點,countDownLatch不可能重新初始化或者修改CountDownLatch對象內部計數器的值,一個線程調用countdown方法happen-before另外一個線程調用await方法

4.同步屏障CyclicBarrier

技術分享


寫到這裏大家不免有些疑問,countDownLatch和cyclicBarrier有什麽區別呢,他們的區別:countDownLatch只能使用一次,而CyclicBarrier方法可以使用reset()方法重置,所以CyclicBarrier方法可以能處理更為復雜的業務場景。

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

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