正文
直接看代码:
public static void main(String[] args) throws InterruptedException {
//当有四个线程时执行方法
CyclicBarrier bar=new CyclicBarrier(4, new Thread(()->{
System.out.println("gogogo");
}));
for(int i=0;i<4;i++) {
new Thread(()->{
for(int j=0;j<2;j++) { //这是跑两组
System.out.println("i am in"+Thread.currentThread().getName());
try {
//当前线程已到达屏障点,然后被阻塞
bar.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}).start();
}
}
我们看第二个for循环,因为它在新线程中,我们会想当然的认为它在创建线程时会先循环两次。那么我们先看看执行结果:
结果可以看出它并不是先循环两次,这是因为下面的await()方法是阻塞的,第一次循环执行到这里时就被阻塞住了,无法进行第二次循环。
程序只能创建新的线程,然后执行循环一次后又被阻塞,直到满足CyclicBarrier的限定线程数并执行完触发条件,这些被阻塞的线程都会被释放开始进行第二次循环。
PS.以上全是个人分析,如有错误还请告知