JavaSE-多线程(7)- CyclicBarrier
CyclicBarrier 直译为循环的关卡,
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest implements Runnable {
private CyclicBarrier cyclicBarrier;
CyclicBarrierTest(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " begin");
try {
// 线程进入就开始等待,直到等待数量达到允许线程继续往下执行的数量,这里是2,每次允许两个线程执行下面的操作
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " end");
}
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(2, () -> {
System.out.println("等待的线程数量达到目标数量,开始继续执行");
});
CyclicBarrierTest cyclicBarrierTest = new CyclicBarrierTest(cyclicBarrier);
for (int i = 0; i < 20; i++) {
Thread t = new Thread(cyclicBarrierTest);
t.setName("线程" + i);
t.start();
}
}
}
线程0 begin
线程4 begin
线程3 begin
线程5 begin
等待的线程数量达到目标数量,开始继续执行
线程2 begin
等待的线程数量达到目标数量,开始继续执行
线程1 begin
线程2 end
线程6 begin
等待的线程数量达到目标数量,开始继续执行
线程6 end
线程9 begin
线程8 begin
等待的线程数量达到目标数量,开始继续执行
线程10 begin
线程12 begin
线程14 begin
线程3 end
线程7 begin
线程11 begin
线程15 begin
线程1 end
等待的线程数量达到目标数量,开始继续执行
线程18 begin
等待的线程数量达到目标数量,开始继续执行
线程13 begin
线程0 end
线程4 end
线程5 end
等待的线程数量达到目标数量,开始继续执行
线程9 end
等待的线程数量达到目标数量,开始继续执行
线程18 end
线程19 begin
线程12 end
线程17 begin
线程16 begin
等待的线程数量达到目标数量,开始继续执行
线程8 end
线程7 end
线程10 end
线程11 end
线程13 end
等待的线程数量达到目标数量,开始继续执行
线程14 end
线程19 end
线程17 end
线程15 end
线程16 end
当同时有多个线程执行时,CyclicBarrier 可以限制继续执行的线程个数,其它线程处于等待状态,当这些线程执行完后再执行下一批线程,起到限流的作用