简单来说原理就是:“人满发车”
代码如下
CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {
@Override
public void run() {
System.out.println("barrier run");
}
});
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
try {
Random random = new Random();
Thread.sleep(random.nextInt(1000)+1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("thread1 一次循环开始");
try {
barrier.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread1 一次循环结束");
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
try {
Random random = new Random();
Thread.sleep(random.nextInt(1000)+1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("thread2 一次循环开始");
try {
barrier.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread2 一次循环结束");
}
}
});
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
try {
Random random = new Random();
Thread.sleep(random.nextInt(1000)+1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("thread3 一次循环开始");
try {
barrier.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread3 一次循环结束");}
}
});
thread1.start();
thread2.start();
thread3.start();
打印结果:
thread2 一次循环开始
thread3 一次循环开始
thread1 一次循环开始
barrier run
thread1 一次循环结束
thread2 一次循环结束
thread3 一次循环结束
thread3 一次循环开始
thread2 一次循环开始
thread1 一次循环开始
barrier run
thread1 一次循环结束
thread3 一次循环结束
thread2 一次循环结束
thread2 一次循环开始
thread1 一次循环开始
thread3 一次循环开始
barrier run
thread3 一次循环结束
thread2 一次循环结束
thread1 一次循环结束
thread3 一次循环开始
thread2 一次循环开始
thread1 一次循环开始
barrier run
cyclicBarrier与countDownLatch
区别在于前者所有线程await后都在等,然后所有线程一起执行
后者所有线程countDown后 countDownLatch wait的那个线程会继续执行
前者阻塞所有线程,后者只阻塞一个线程