天天看點

多線程之countDownLatch

原本是昨天分享countDownLatch相關知識點的,但是昨天粗略看寫了,發現自己對countDownLatch的認知還不夠,是以就半道分享了常用的三種多線程線程安全解決方案的性能比較,雖然過程中翻車了,但是還是有收獲的,也不虧。今天又去看了下count的相關知識,然後做了一個小demo,感覺有點眉目了,是以我們來繼續看countDownLatch。

countDownLath是jdk1.5引入的一個新特性,它的出現主要是為了解決某些應用場景下多線程運作順序的問題。我們在定義countDownLatch的時候,需要指定它的count大小,它就是通過這個count來控制多線程運作順序的。

它有兩個核心的方法countDown和await,countDown的作用是當線程執行完後把count減一,隻能用一次;await方法是判斷count是否減為0,這個方法本身是阻塞的,如果count不是0,await後面的代碼是不會被執行的。

接下來,我們通過一段示例代碼來看下countDownLatch的基本用法:

這裡我分别定義了三個線程,前兩個線程構造的時候都需要傳入countDownLatch,然後在run方法的尾部執行countDown方法,也就是每啟動一個線程,count減一。

我們這裡還定義了兩個countDownLatch,初始值分别是100和50,他們分别對應線程task1和task2的執行次數。

線上程task1和task2之間我們執行第一個countDownLatch的await方法,控制線程task1和task2的執行順序,確定線程task1先執行;

線上程task2和線程task3之間我們執行第二個countDownLatch的await方法,控制線程task2和task3的執行順序,確定線程task2先執行。

然後,我們運作上面的代碼,會得到如下結果:

在以上結果中,我們可以看到,不論你執行多少次,線程運作順序都是task1、task2、task3,當然await方法之前的執行順序我們是沒有辦法控制的。

從上面示範結果來看,countDownLatch主要是用來控制多線程運作順序的,特别适合多個線程協同運作但是有順序要求的業務,更多應用場景大家可以好好研究,我們今天的内容就到這裡吧!