CyclicBarrier适用于这样的情况:你希望创建一组任务,它们并行地执行工作,然后在下一个步骤之前等待,直到所有任务都完成。栅栏和闭锁的关键区别在于,所有线程必须同时到达栅栏位置,才能继续执行。

闭锁用于等待事件,而栅栏是线程之间彼此等待,等到都到的时候再决定做下一件事。

拿运动员的事情举例,运动员们跑到终点,互相等待所有人都到达终点后,再一起去做喝酒这件事。(运动员也许不能喝酒的,也许大家再跑一轮。)

下面用一个赛马程序来举例:

```java

package concurrency;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.concurrent.*;

class Horse implements Runnable {

private static int counter = 0;

private final int id = counter++;

private int strides = 0;

private static Random rand = new Random(47);

private static CyclicBarrier barrier;

public Horse(CyclicBarrier b) {barrier = b;}

public synchronized int getStrides() {return strides;}

public void run() {

try {

while (!Thread.interrupted()) { //线程内不断循环

synchronized (this) {

strides += rand.nextInt(3); //每次马可以走0,1或者2步

}

barrier.await(); //走完后,就等所有其它马也走完,才能开始下一回合

}

} catch (InterruptedException e) {

} catch (BrokenBarrierException e) {

throw new RuntimeException(e);

}

}

@Override

public String toString() {

return "Horse " + id + " ";

}

public String tracks() {

StringBuilder s =new StringBuilder();

for(int i = 0; i < getStrides();i++)

s.append("*"); //这里打印每个马走的轨迹

s.append(id);

return s.toString();

}

}

java 栅栏_Java 并发工具类(栅栏 CyclicBarrier )相关推荐

  1. java闭锁_Java并发工具类(闭锁CountDownLatch)

    闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态. CountDownLatch是一种灵活的闭锁实现,它可以使一个或者多个线程等待一组事件的发生. 闭锁状态包含一个计数器,该计数器被初始化为 ...

  2. 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)

    文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...

  3. 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)

    文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...

  4. 【搞定Java并发编程】第24篇:Java中的并发工具类之CountDownLatch

    上一篇:Java中的阻塞队列 BlockingQueue 详解 本文目录: 1.CountDownLatch的基本概述 2.CountDownLatch的使用案例 3.CountDownLatch的源 ...

  5. Java 中的并发工具类

    From: https://blog.wuwii.com/juc-utils.html java.util.concurrent 下提供了一些辅助类来帮助我们在并发编程的设计. 学习了 AQS 后再了 ...

  6. 《Java并发编程的艺术》读书笔记 - 第八章 - Java中的并发工具类

    目录 前言 等待多线程完成的 CountDownLatch 示例 同步屏障 CyclicBarrier 示例 CyclicBarrier 和 CountDownLatch 的区别 控制并发线程数量的 ...

  7. 死磕Java并发:J.U.C之并发工具类:CyclicBarrier

    作者:chenssy 来源:Java技术栈公众号 CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier ...

  8. JAVA线程并发数量控制_Java并发工具类(三):控制并发线程数的Semaphore

    作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数 ...

  9. 用java实现combin函数_Java并发工具类CompletableFuture教程与示例

    Java 8带来了大量的新功能和增强功能,例如Lambda表达式,Streams,CompletableFutures等.在本文中,我将通过简单的示例向您详细说明CompletableFuture及其 ...

最新文章

  1. Good Bye 2014 B. New Year Permutation(floyd )
  2. MVC4做网站后台:模块管理1、修改模块信息
  3. python协程实时输出_python协程
  4. python中的引用类型_Python 中的引用和类属性的初步理解
  5. java之Arrays工具类的使用
  6. 常用的排序算法的时间复杂度和空间复杂度 .
  7. 苹果6屏幕多大_苹果12使用高通X55,10亿买下的英特尔基带何时能派上用场
  8. myeclipse连接mysql怎么调用_myeclipse连接mysql数据库详细步骤
  9. Ubuntu下apt-get命令详解(转)
  10. 监听屏幕解锁和判断屏幕状态
  11. 2022最新软件设计师历年真题和答案解析分享!
  12. sql语句之多表查询
  13. 中国生态城市规划行业“十四五”规划与前景规模预测报告2022-2028年版
  14. 4W家庭理财 V2.0
  15. 基于CNN的区域特定多尺度特征提取的两阶段停车位检测
  16. 【好奇心驱动力】APP每日打卡自动化测试
  17. BUCTOJ邀请赛20180814-D: String
  18. 如何学习大型项目的源码?
  19. 使用python抓取并分析数据—链家网(requests+BeautifulSoup)(转)
  20. 47个经典java程序编程题

热门文章

  1. Python3学习(33)--序列和反序列化(二)
  2. 欠压继电器与过电压继电器
  3. uniapp公共测试证书签名
  4. cmake rpath Makefile rapth
  5. 高中数学知识点:集合知识讲解
  6. uafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in main.obj
  7. 1183: 平面点排序(一)(结构体专题)C语言
  8. LeetCode题解系列--309. Best Time to Buy and Sell Stock with Cooldown
  9. Centos初学者需要会的几种命令(2)
  10. 科罗拉多州奥罗拉市用基于磁盘的ExaGrid系统取代磁带备份