| 1、允许一组线程相互等待达到一个公共的障碍点,之后再继续执行 |
| 2、跟countDownLatch的区别 |
| CountDownLatch一般用于某个线程等待若干个其他线程执行完任务之后,它才执行;不可重复使用 |
| CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;可重用的 |
| |
| import java.util.concurrent.BrokenBarrierException; |
| import java.util.concurrent.CyclicBarrier; |
| |
| public class CyclicBarrierDemo { |
| |
| public static void main(String[] args) { |
| |
| CyclicBarrier cyclicBarrier = new CyclicBarrier(8); |
| |
| for (int i = 0; i < 8; i++) { |
| int finalI = i; |
| new Thread(() -> { |
| try { |
| Thread.sleep(finalI * 1000L); |
| System.out.println(Thread.currentThread().getName() + "准备就绪"); |
| cyclicBarrier.await(); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| } catch (BrokenBarrierException e) { |
| e.printStackTrace(); |
| } |
| System.out.println("开始比赛"); |
| }).start(); |
| } |
| } |
| |
| } |
| |
| # 控制台打印结果: |
| Thread-0准备就绪 |
| Thread-1准备就绪 |
| Thread-2准备就绪 |
| Thread-3准备就绪 |
| Thread-4准备就绪 |
| Thread-5准备就绪 |
| Thread-6准备就绪 |
| Thread-7准备就绪 |
| 开始比赛 |
| 开始比赛 |
| 开始比赛 |
| 开始比赛 |
| 开始比赛 |
| 开始比赛 |
| 开始比赛 |
| 开始比赛 |
| |
| Process finished with exit code 0 |
| # 查看CyclicBarrier对象 |
| public CyclicBarrier(int parties) { |
| this(parties, null); |
| } |
| |
| # 查看this方法 |
| public CyclicBarrier(int parties, Runnable barrierAction) { |
| if (parties <= 0) throw new IllegalArgumentException(); |
| this.parties = parties; |
| this.count = parties; |
| this.barrierCommand = barrierAction; |
| } |
| |
| # 查看count,表示正在等待的个数 |

| # 查看await方法 |
| public int await() throws InterruptedException, BrokenBarrierException { |
| try { |
| return dowait(false, 0L); |
| } catch (TimeoutException toe) { |
| throw new Error(toe); |
| } |
| } |
| |
| # 查看dowait方法 |
| private int dowait(boolean timed, long nanos) |
| throws InterruptedException, BrokenBarrierException, |
| TimeoutException { |
| final ReentrantLock lock = this.lock; |
| lock.lock(); |
| try { |
| final Generation g = generation; |
| |
| if (g.broken) |
| throw new BrokenBarrierException(); |
| |
| if (Thread.interrupted()) { |
| breakBarrier(); |
| throw new InterruptedException(); |
| } |
| |
| int index = --count; |
| if (index == 0) { |
| boolean ranAction = false; |
| try { |
| final Runnable command = barrierCommand; |
| if (command != null) |
| command.run(); |
| ranAction = true; |
| nextGeneration(); |
| return 0; |
| } finally { |
| if (!ranAction) |
| breakBarrier(); |
| } |
| } |
| |
| # 获取broken并指定为false |
| private static class Generation { |
| Generation() {} |
| boolean broken; |
| } |
| |
| # 继续查看dowait方法 |
| private int dowait(boolean timed, long nanos) |
| throws InterruptedException, BrokenBarrierException, |
| TimeoutException { |
| final ReentrantLock lock = this.lock; |
| lock.lock(); |
| try { |
| final Generation g = generation; |
| |
| if (g.broken) |
| throw new BrokenBarrierException(); |
| |
| if (Thread.interrupted()) { |
| breakBarrier(); |
| throw new InterruptedException(); |
| } |
| |
| int index = --count; |
| if (index == 0) { |
| boolean ranAction = false; |
| try { |
| final Runnable command = barrierCommand; |
| if (command != null) |
| command.run(); |
| ranAction = true; |
| nextGeneration(); |
| return 0; |
| } finally { |
| if (!ranAction) |
| breakBarrier(); |
| } |
| } |
| |
| # 继续查看dowait方法 |
| private int dowait(boolean timed, long nanos) |
| throws InterruptedException, BrokenBarrierException, |
| TimeoutException { |
| final ReentrantLock lock = this.lock; |
| lock.lock(); |
| try { |
| final Generation g = generation; |
| |
| if (g.broken) |
| throw new BrokenBarrierException(); |
| |
| if (Thread.interrupted()) { |
| breakBarrier(); |
| throw new InterruptedException(); |
| } |
| |
| int index = --count; |
| if (index == 0) { |
| boolean ranAction = false; |
| try { |
| final Runnable command = barrierCommand; |
| if (command != null) |
| command.run(); |
| ranAction = true; |
| nextGeneration(); |
| return 0; |
| } finally { |
| if (!ranAction) |
| breakBarrier(); |
| } |
| } |
| |
| |
| for (;;) { |
| try { |
| if (!timed) |
| trip.await(); |
| else if (nanos > 0L) |
| nanos = trip.awaitNanos(nanos); |
| } catch (InterruptedException ie) { |
| if (g == generation && ! g.broken) { |
| breakBarrier(); |
| throw ie; |
| } else { |
| |
| |
| |
| Thread.currentThread().interrupt(); |
| } |
| } |
| |
| if (g.broken) |
| throw new BrokenBarrierException(); |
| |
| if (g != generation) |
| return index; |
| |
| if (timed && nanos <= 0L) { |
| breakBarrier(); |
| throw new TimeoutException(); |
| } |
| } |
| } finally { |
| lock.unlock(); |
| } |
| } |
| |
| # 继续查看dowait方法 |
| private int dowait(boolean timed, long nanos) |
| throws InterruptedException, BrokenBarrierException, |
| TimeoutException { |
| final ReentrantLock lock = this.lock; |
| lock.lock(); |
| try { |
| final Generation g = generation; |
| |
| if (g.broken) |
| throw new BrokenBarrierException(); |
| |
| if (Thread.interrupted()) { |
| breakBarrier(); |
| throw new InterruptedException(); |
| } |
| |
| int index = --count; |
| if (index == 0) { |
| boolean ranAction = false; |
| try { |
| final Runnable command = barrierCommand; |
| if (command != null) |
| command.run(); |
| ranAction = true; |
| nextGeneration(); |
| return 0; |
| } finally { |
| if (!ranAction) |
| breakBarrier(); |
| } |
| } |
| |
| # 查看nextGeneration方法 |
| private void nextGeneration() { |
| |
| trip.signalAll(); |
| |
| count = parties; |
| generation = new Generation(); |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2021-05-16 真实机中安装CentOS7(一)