CyclicBarrier 从字面上理解为循环栅栏。起到的就是屏障的作用,阻止线程通过,而循环则是指其可以反复使用。和CountDownLatch不同的是,CountDownLatch的await方法在主线程中使用,阻塞的是主线程,当各个子线程执行完后,再执行主线程。CyclicBarrier的await方法在各个子线程中使用,阻塞的是各个子线程,当所有线程都到await方法处时,各个子线程再一起执行。
CyclicBarrier cyclicBarrier = new CyclicBarrier(4, () ->
System.out.println("已经满4个线程,可以一起执行了!")
);
IntStream.range(1, 11).forEach(number -> {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + "到了");
cyclicBarrier.await();
System.out.println(Thread.currentThread().getName() + "继续执行");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}, "线程->" + number).start();
});
结果:
线程->1到了
线程->2到了
线程->3到了
线程->4到了
已经满4个线程,可以一起执行了!
线程->1继续执行
线程->2继续执行
线程->4继续执行
线程->3继续执行
线程->5到了
线程->6到了
线程->7到了
线程->8到了
已经满4个线程,可以一起执行了!
线程->5继续执行
线程->6继续执行
线程->8继续执行
线程->7继续执行
线程->9到了
线程->10到了
网友评论