CyclicBarrier:
適合的業務場景,比如
1)、,現有一大任務,需要得到全年的統計資料的,這個工作量是巨大的,那麼可以將其分割為12個月的子任務,各個子任務相互獨立,當所有子任務完成了,則就可以進行全年統計了,這樣大大提升了統計效率。
2)、大家一起去郊遊,由於大家住的地方比較分散,故需要一個集合點之後一起出發,這樣大家才能玩得開心嘛。
。。。。等等
就是當有一個大任務時,需要分配多個子任務去執行,只有當所有的子任務都執行完成後,才能執行主任務。
//阻塞等待 public int await()
CountDownLatch:
適合的業務場景,比如
1)、運動會中賽跑專案,之後所有的賽跑運動員準備好了,此時裁判才能宣佈該賽跑專案正式開始,裁判才能打出發信槍;當參與此次賽跑專案的所有的運動員都跑完了,此次賽跑專案才能算結束,才能統計出比賽名次。
。。。。等等
就是所有的準備好了,才能開始;或者是所有的都結束了,才能算結束。
//阻塞等待,直到計數器清零 public void await() //阻塞等待,直到等待到最長時間,當等待時間超過設定時間時,計數器還沒有清零,則返回false,否則返回true public boolean await(long timeout, TimeUnit unit) //計數器減一,當計數器清零時,await的執行緒會被喚醒,執行緒繼續執行 public void countDown() //獲取當前計數器的大小 public long getCount()
Semaphore:
適合的業務場景,比如
1)、當有10個人去上茅廁,但是隻有5個坑,即只能同時5個人使用,只有當一個人不使用坑了,另一個人才能使用該空閒的坑,一直維持著只能同時5個人使用。
2)、當停車場來了100輛車時,但是隻有30個停車位,即只能同時提供30個車輛停放,只有當一輛車開走了,另一輛車才能進入該空閒的停車位,一直維持著只能同時提供30個停車位。
。。。。等等
就是同時只能提供有限的,走一個才能進一個。
//申請獲取許可,當沒有剩餘的許可時,則被阻塞 public void acquire() //釋放一個許可 public void release()
總結:
CountDownLatch是等待一組執行緒執行完畢後才能繼續執行
CyclicBarrier是能讓一組執行緒達到一個同步點時被阻塞,直到最後一個執行緒達到,阻塞才會消失,其是可以迴圈使用的
Semaphore是隻允許一定數量的執行緒同時執行