java多執行緒之CyclicBarrier
阿新 • • 發佈:2019-01-11
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();
}
測試結果:
從測試結果可以看到,只有所有客戶端操作完畢後,查詢餘額操作才能繼續執行。