还是先看一下CyclicBarrier类所在的位置
还是JUC下面的。CyclicBarrier是允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。
CyclicBarrier支持一个可选的Runnable命令,每个屏障点运行一次,在派对中的最后一个线程到达之后,但在任何线程释放之前。 在任何一方继续进行之前,此屏障操作对更新共享状态很有用。
demo:
package com.qcby.juc;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class cyclicBarrier {
public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("线程齐了,我们一起回线程池");
});
for (int i = 0; i <=7 ; i++) {
new Thread(()->{
System.out.println("我是"+Thread.currentThread().getName());
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
结果:
改变线程数量
package com.qcby.juc;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class cyclicBarrier {
public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("线程齐了,我们一起回线程池");
});
for (int i = 0; i <=10; i++) {
new Thread(()->{
System.out.println("我是"+Thread.currentThread().getName());
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
这里我们把创建11个线程,看一下运行结果:
再次改变创建线程的数量:
package com.qcby.juc;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class cyclicBarrier {
public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("线程齐了,我们一起回线程池");
});
for (int i = 0; i <14; i++) {
new Thread(()->{
System.out.println("我是"+Thread.currentThread().getName());
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
这次我们创建了14个线程,看一下执行结果:
总结
当我们创建的线程数量是CyclicBarrier方法参数中设置的线程数量parties的整数倍时,当第parties-1个线程执行完 cyclicBarrier.await();方法的时候,就会执lamda表达式里面的代码。之所以叫Cyclic,是因为如果线程数量不是parties的整数倍,程序不会结束,一直等待,小伙伴们可以自己动手敲一下。