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();
}
测试结果:
从测试结果可以看到,只有所有客户端操作完毕后,查询余额操作才能继续执行。