1. 程式人生 > >java多執行緒之CyclicBarrier

java多執行緒之CyclicBarrier

CyclicBarrier是一個同步的輔助類,允許一組執行緒相互之間等待,達到一個共同點,再繼續執行。
優點:可重用;
應用場景:多個執行緒達到一致條件後繼續執行。

示例程式碼:

CyclicBarrierTest類:

public class CyclicBarrierTest {
	
	private CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
	private static int balance = 0;
	
	public void afterWrite() {
		
		for (int i = 0; i < 3; i++) {
			new Thread(new Runnable() {
				public void run() {
					System.out.println(Thread.currentThread().getName() + "客戶端正在存錢...");
					balance = balance + 100;
					try {
						//隨機睡眠時間,模擬存款時間
						Thread.sleep(new Random().nextInt(1500));
						System.out.println(Thread.currentThread().getName() + "客戶端存錢完畢");
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					try {
						//等待其它客戶端存完錢
						cyclicBarrier.await();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (BrokenBarrierException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + "客戶端查詢餘額為:" + balance);
				}
			}).start();
		}
	}
}

Main類:

public class Main {
	
	public static void main(String[] args) throws Exception {
        System.out.println("------------cyclicBarrier測試-------------------");
		new CyclicBarrierTest().afterWrite();
}

測試結果:

從測試結果可以看到,只有所有客戶端操作完畢後,查詢餘額操作才能繼續執行。