1. 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。
    package com.example.demo.util.dxc;
  2.  
  3. import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.FutureTask;
  4.  
  5. /**
    * 测试CyclicBarrier 循环栅栏
    */
    public class TestCycliBarrier {
  6.  
  7. public void test() throws Exception {
    int threadNum = 10;
    Integer total = 0;
    CyclicBarrier cyclicBarrier1 = new CyclicBarrier(threadNum, new Runnable() {
    //最后一个线程到栅栏后要做的任务
    @Override
    public void run() {
    System.out.println("准备就绪,开始计算...");
    }
    });
    List<FutureTask<Integer>> list = new ArrayList<>();
    for (int j = 0; j < threadNum; j++) {
    FutureTask<Integer> future = new FutureTask<Integer>(new MyCallThread(cyclicBarrier1));
    Thread thread = new Thread(future);
    thread.start();
    list.add(future);
    }
    for (FutureTask<Integer> integerFutureTask : list) {
    total += integerFutureTask.get();
    }
    System.out.println("计算结果:" + total);
    }
  8.  
  9. public static void main(String[] args) throws Exception {
    new TestCycliBarrier().test();
    }
  10.  
  11. }
  12.  
  13. package com.example.demo.util.dxc;
  1. import java.util.concurrent.Callable;
    import java.util.concurrent.CyclicBarrier;
  2.  
  3. public class MyCallThread implements Callable<Integer> {
    private CyclicBarrier cyclicBarrier;
  4.  
  5. public MyCallThread(CyclicBarrier cyclicBarrier) {
    this.cyclicBarrier = cyclicBarrier;
    }
  6.  
  7. @Override
    public Integer call() throws Exception {
    int num = 0;
    for (int i = 0; i <= 100; i++) {
    num += i;
    }
    System.out.println(Thread.currentThread().getName() + ":befor");
    //等待所有线程到达之后才会返回num
    cyclicBarrier.await();
    System.out.println(Thread.currentThread().getName() + ":after");
    return num;
    }
    }

Java并发-CycliBarrier的更多相关文章

  1. java并发的处理方式

    1 什么是并发问题. 多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发问题. 银行两操作员同时操作同一账户就是典型的例子.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该 ...

  2. 面试王牌 JAVA并发

    Java 并发 JavathreadSocketC#C++ 并发 Table of Contents 1 什么是并发问题. 2多线程死锁问题 2 java中synchronized的用法 3 Java ...

  3. java并发知识点

    前言 先列出java并发涉及的知识点,后面再慢慢补. java并发 1 常见概念 进程/线程 进程:程序执行的实体,操作系统资源调度资源分配的基本单元 线程:程序执行的最小单元,拥有独立的堆栈和局部变 ...

  4. Java并发II

    Java并发 J.U.C图 一.线程的安全性 当多个线程访问某个类的时候,不管运行环境采用何种方式调度或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都可以表现出正确的行 ...

  5. 多线程的通信和同步(Java并发编程的艺术--笔记)

    1. 线程间的通信机制 线程之间通信机制有两种: 共享内存.消息传递.   2. Java并发 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式执行,通信的过程对于程序员来说是完全透 ...

  6. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  7. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  8. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  9. 【Java并发编程实战】-----“J.U.C”:CLH队列锁

    在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...

随机推荐

  1. linux系统下自动删除前N天的日志文件

    删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令: find /opt/soft/log/ -mti ...

  2. [论文笔记] Fine-Grained Head Pose Estimation Without Keypoints

    Fine-Grained Head Pose Estimation Without Keypoints 简介 head pose estimation 经典论文,使用CNN预测三个角度值,pitch, ...

  3. 数据结构和算法(Java版)快速学习(栈与队列)

    栈是仅允许在表尾进行插入和删除操作的线性表.我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom).栈是一种后进先出(Last In First Out)的线性表,简称(LIFO ...

  4. 3、electron打包生成exe文件

    打包方式1:DOS窗口命令打包 DOS 下,输入 npm install electron-packager -g全局安装我们的打包神器: cnpm install electron-packager ...

  5. oracle中awr性能报告阅读笔记

    1.对于数据库运行的业务不太了解,那么awr性能报告中最需要关注的是Top 5 Timed Foreground Events和Time Model Statistics两个部分

  6. Docker部署MySQL8并实现远程连接

    1. 拉取镜像 docker pull mysql 2. 运行镜像启动容器 docker run --name mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=y ...

  7. c++实验9 图及图的操作实验

    实验9 图及图的操作实验 --博客后半部分有程序的所有代码-- 1.图邻接矩阵存储结构表示及基本操作算法实现 (1)邻接矩阵存储结构类定义: #include "SeqList.h" ...

  8. 四种方法 恢复损坏的Excel文档

    四种方法 恢复损坏的Excel文档 打开一个以前编辑好的Excel工作簿,却发现内容混乱,无法继续进行编辑,而且还不能够进行打印.这是很多朋友在处理Excel文件时都可能会遇到的一个问题,面对这种情况 ...

  9. 虚拟机中Ubuntu安装及基本功能设置

    虚拟机下安装ubuntu 虚拟机使用VMware14 PRO,在TOSHIBA EXT/Anon Comm Group\Experimental Environment\VMware下. 系统使用ub ...

  10. CSS3—— 2D转换 3D转换 过渡 动画

    2D转换 对元素进行移动.缩放.转动.拉长或拉伸 ————>  ————>   移动 顺时针旋转 扩大/缩小 倾斜 2D变换合并  3D转换 绕x轴 绕y轴 过渡 从一种样式逐渐改变为另一 ...