我想應(yīng)該有很多辦法,如果是簡(jiǎn)單的1:1關(guān)系,那么可以wait()和notify()解決,就像一把鎖和一把鑰匙;如果是1:N關(guān)系,這個(gè)1就需要關(guān)心N的所有狀態(tài)了,最笨的辦法是1可以去查看N當(dāng)前的狀態(tài),輪詢?cè)儐?wèn)工作是否做完。而好點(diǎn)的辦法是N做完后主動(dòng)告訴1,然后N就會(huì)有2種選擇,要么聽(tīng)從1的命令,要么繼續(xù)干自己其他的活。
用傳統(tǒng)的方法我想應(yīng)該是都能實(shí)現(xiàn)的,而JDK1.5提供了CyclicBarrier與CountDownLatch來(lái)解決了這兩個(gè)問(wèn)題,而她們的區(qū)別是:
CyclicBarrier使所有線程相互等待,而CountDownLatch使一個(gè)或多個(gè)線程等待其他線程。區(qū)別類似上面藍(lán)色字體,CountDownLatch不會(huì)等待其他線程了,只要做完自己的工作就干自己的活去了,也就是run()方法里其他的任務(wù)。
Example:
































輸出的結(jié)果為:
The bow is coming
kick a bow
do other thing
Wait...
The bow is coming
kick a bow
do other thing
End..
如上所說(shuō)do other thing不受影響。
寫(xiě)了一個(gè)CyclicBarrier的例子:











































輸出結(jié)果為:
Wait...
The bow is coming
kick a down
The bow is coming
kick a down
do other thing
End..
do other thing
總結(jié):
我們看到do other thing被阻塞了,直到最后才執(zhí)行,可見(jiàn),柵欄和計(jì)數(shù)器的目完全不同了。向Doug Lea牛人學(xué)習(xí):)
在網(wǎng)上看到很多人對(duì)于CountDownLatch和CyclicBarrier的區(qū)別簡(jiǎn)單理解為CountDownLatch是一次性的,而CyclicBarrier在調(diào)用reset之后還可以繼續(xù)使用。那如果只是這么簡(jiǎn)單的話,我覺(jué)得CyclicBarrier簡(jiǎn)單命名為ResetableCountDownLatch好了,顯然不是的。
我的理解是,要從他們的設(shè)計(jì)目的去看這兩個(gè)類。javadoc里面的描述是這樣的。
CountDownLatch: A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
CyclicBarrier : A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
可能是我的英語(yǔ)不夠好吧, 我感覺(jué)從這個(gè)javadoc里面要準(zhǔn)確理解他們的差異還是不容易的。
我的理解是
CountDownLatch : 一個(gè)線程(或者多個(gè)), 等待另外N個(gè)線程完成某個(gè)事情之后才能執(zhí)行。 CyclicBarrier : N個(gè)線程相互等待,任何一個(gè)線程完成之前,所有的線程都必須等待。
這樣應(yīng)該就清楚一點(diǎn)了,對(duì)于CountDownLatch來(lái)說(shuō),重點(diǎn)是那個(gè)“一個(gè)線程”, 是它在等待, 而另外那N的線程在把“某個(gè)事情”做完之后可以繼續(xù)等待,可以終止。而對(duì)于CyclicBarrier來(lái)說(shuō),重點(diǎn)是那N個(gè)線程,他們之間任何一個(gè)沒(méi)有完成,所有的線程都必須等待。
CountDownLatch 是計(jì)數(shù)器, 線程完成一個(gè)就記一個(gè), 就像 報(bào)數(shù)一樣, 只不過(guò)是遞減的.
而CyclicBarrier更像一個(gè)水閘, 線程執(zhí)行就想水流, 在水閘處都會(huì)堵住, 等到水滿(線程到齊)了, 才開(kāi)始泄流.