那些青春的歲月
我想應該有很多辦法,如果是簡單的1:1關系,那么可以wait()和notify()解決,就像一把鎖和一把鑰匙;如果是1:N關系,這個1就需要關心N的所有狀態了,最笨的辦法是1可以去查看N當前的狀態,輪詢詢問工作是否做完。而好點的辦法是N做完后主動告訴1,然后N就會有2種選擇,要么聽從1的命令,要么繼續干自己其他的活。
用傳統的方法我想應該是都能實現的,而JDK1.5提供了CyclicBarrier與CountDownLatch來解決了這兩個問題,而她們的區別是:
CyclicBarrier使所有線程相互等待,而CountDownLatch使一個或多個線程等待其他線程。區別類似上面藍色字體,CountDownLatch不會等待其他線程了,只要做完自己的工作就干自己的活去了,也就是run()方法里其他的任務。
Example:
輸出的結果為:
The bow is comingkick a bow do other thingWait...The bow is comingkick a bow do other thingEnd..
如上所說do other thing不受影響。
寫了一個CyclicBarrier的例子:
輸出結果為:
Wait...The bow is comingkick a downThe bow is comingkick a downdo other thingEnd..do other thing
總結:
我們看到do other thing被阻塞了,直到最后才執行,可見,柵欄和計數器的目完全不同了。向Doug Lea牛人學習:)
在網上看到很多人對于CountDownLatch和CyclicBarrier的區別簡單理解為CountDownLatch是一次性的,而CyclicBarrier在調用reset之后還可以繼續使用。那如果只是這么簡單的話,我覺得CyclicBarrier簡單命名為ResetableCountDownLatch好了,顯然不是的。我的理解是,要從他們的設計目的去看這兩個類。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.
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.
可能是我的英語不夠好吧, 我感覺從這個javadoc里面要準確理解他們的差異還是不容易的。我的理解是
CountDownLatch : 一個線程(或者多個), 等待另外N個線程完成某個事情之后才能執行。 CyclicBarrier : N個線程相互等待,任何一個線程完成之前,所有的線程都必須等待。這樣應該就清楚一點了,對于CountDownLatch來說,重點是那個“一個線程”, 是它在等待, 而另外那N的線程在把“某個事情”做完之后可以繼續等待,可以終止。而對于CyclicBarrier來說,重點是那N個線程,他們之間任何一個沒有完成,所有的線程都必須等待。
CountDownLatch 是計數器, 線程完成一個就記一個, 就像 報數一樣, 只不過是遞減的.而CyclicBarrier更像一個水閘, 線程執行就想水流, 在水閘處都會堵住, 等到水滿(線程到齊)了, 才開始泄流.
Copyright @ abin Powered by: .Text and ASP.NET Theme by: .NET Monster