CountDownLatch和CyclicBarrier的區(qū)別
Posted on 2015-03-02 06:28 leekiang 閱讀(488) 評(píng)論(0) 編輯 收藏 所屬分類: javaCountDownLatch : 一個(gè)線程(或者多個(gè)), 等待另外N個(gè)線程完成某個(gè)事情之后才能執(zhí)行。? ?
CyclicBarrier? : N個(gè)線程相互等待,任何一個(gè)線程完成之前,所有的線程都必須等待。
這樣應(yīng)該就清楚一點(diǎn)了,對(duì)于CountDownLatch來說,重點(diǎn)是那個(gè)“一個(gè)線程”, 是它在等待, 而另外那N的線程在把“某個(gè)事情”做完之后可以繼續(xù)等待,可以終止。而對(duì)于CyclicBarrier來說,重點(diǎn)是那N個(gè)線程,他們之間任何一個(gè)沒有完成,所有的線程都必須等待。
CyclicBarrier 在釋放等待線程后可以重用,所以稱它為循環(huán)的 barrier。它 還支持一個(gè)可選的 Runnable 命令,在一組線程中的最后一個(gè)線程到達(dá)之后(但在釋放所有線程之前),該命令只在每個(gè)屏障點(diǎn)運(yùn)行一次。若在繼續(xù)所有參與線程之前更新共享狀態(tài),此屏障操作很有用。
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("所有玩家進(jìn)入第二關(guān)!");
??????????? }
??????? });
??????? 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 + "正在玩第一關(guān)...");
??????????????? cyclicBarrier.await();
??????????????? System.out.println("玩家" + id + "進(jìn)入第二關(guān)...");
??????????? } catch (InterruptedException e) {
??????????????? e.printStackTrace();
??????????? } catch (BrokenBarrierException e) {
??????????????? e.printStackTrace();
??????????? }
??????? }
??? }
}
CyclicBarrier? : N個(gè)線程相互等待,任何一個(gè)線程完成之前,所有的線程都必須等待。
這樣應(yīng)該就清楚一點(diǎn)了,對(duì)于CountDownLatch來說,重點(diǎn)是那個(gè)“一個(gè)線程”, 是它在等待, 而另外那N的線程在把“某個(gè)事情”做完之后可以繼續(xù)等待,可以終止。而對(duì)于CyclicBarrier來說,重點(diǎn)是那N個(gè)線程,他們之間任何一個(gè)沒有完成,所有的線程都必須等待。
CyclicBarrier 在釋放等待線程后可以重用,所以稱它為循環(huán)的 barrier。它 還支持一個(gè)可選的 Runnable 命令,在一組線程中的最后一個(gè)線程到達(dá)之后(但在釋放所有線程之前),該命令只在每個(gè)屏障點(diǎn)運(yùn)行一次。若在繼續(xù)所有參與線程之前更新共享狀態(tài),此屏障操作很有用。
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("所有玩家進(jìn)入第二關(guān)!");
??????????? }
??????? });
??????? 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 + "正在玩第一關(guān)...");
??????????????? cyclicBarrier.await();
??????????????? System.out.println("玩家" + id + "進(jìn)入第二關(guān)...");
??????????? } catch (InterruptedException e) {
??????????????? e.printStackTrace();
??????????? } catch (BrokenBarrierException e) {
??????????????? e.printStackTrace();
??????????? }
??????? }
??? }
}