Posted on 2015-03-02 06:28
leekiang 閱讀(483)
評論(0) 編輯 收藏 所屬分類:
java
CountDownLatch : 一個線程(或者多個), 等待另外N個線程完成某個事情之后才能執行。? ?
CyclicBarrier? : N個線程相互等待,任何一個線程完成之前,所有的線程都必須等待。
這樣應該就清楚一點了,對于CountDownLatch來說,重點是那個“一個線程”, 是它在等待, 而另外那N的線程在把“某個事情”做完之后可以繼續等待,可以終止。而對于CyclicBarrier來說,重點是那N個線程,他們之間任何一個沒有完成,所有的線程都必須等待。
CyclicBarrier 在釋放等待線程后可以重用,所以稱它為循環的 barrier。它 還支持一個可選的 Runnable 命令,在一組線程中的最后一個線程到達之后(但在釋放所有線程之前),該命令只在每個屏障點運行一次。若在繼續所有參與線程之前更新共享狀態,此屏障操作很有用。
public class Test {
??? public static void main(String[] args) {
??????? new Test().test1();
??? }
?? ?
??? public void test1() {
??????? CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Runnable() {
??????????? @Override
??????????? public void run() {
??????????????? System.out.println("所有玩家進入第二關!");
??????????? }
??????? });
??????? for (int i = 0; i < 4; i++) {
??????????? new Thread(new Player(i, cyclicBarrier)).start();
??????? }
??? }
??? class Player implements Runnable {
??????? private CyclicBarrier cyclicBarrier;
??????? private int id;
??????? public Player(int id, CyclicBarrier cyclicBarrier) {
??????????? this.cyclicBarrier = cyclicBarrier;
??????????? this.id = id;
??????? }
??????? @Override
??????? public void run() {
??????????? try {
??????????????? System.out.println("玩家" + id + "正在玩第一關...");
??????????????? cyclicBarrier.await();
??????????????? System.out.println("玩家" + id + "進入第二關...");
??????????? } catch (InterruptedException e) {
??????????????? e.printStackTrace();
??????????? } catch (BrokenBarrierException e) {
??????????????? e.printStackTrace();
??????????? }
??????? }
??? }
}