java 多线程中  - 栅栏   就是用一个线程去等待,被唤醒的次数,如果次数和要等待的次数相同时开始执行

其原理个人理解:

设置一个线程安全的变量 CyclicBarrier barrier  中的一个计数变量  ,然后创建一个等待线程,一直wait 等待 这个计数变量修改时唤醒,

唤醒时然后判断该计数变量和创建时的 等待线程数进行比较,如果大于或者等于时,开始执行跳过wait

需要等待的线程每次执行完都需要调用barrier.await()  去修改这个计数变量

public class Test {

public static void startE() {

System.out.println("start E");

}

public static void main(String[] args) {

final int count = 3;

final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() {

@Override

public void run() {

for(int i=0;i<8;i++){

System.out.println("E "+i);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

});

String [] Ids = {"A", "B", "C"};

int[] times = {2,4,5};

for (int i = 0; i < count; i++) {

new Thread(new Worker(Ids[i],times[i], barrier)).start();

}

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

for(int i= 0 ;i<10;i++){

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("D "+i);

}

}

}).start();

}

}

class Worker implements Runnable {

final String id;

final CyclicBarrier barrier;

int times =0;

public Worker(final String ids,int times, final CyclicBarrier barrier) {

this.id = ids;

this.barrier = barrier;

this.times = times;

}

@Override

public void run() {

try {

for(int i=0;i

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(id+" "+i);

}

this.barrier.await();

} catch (InterruptedException e) {

e.printStackTrace();

} catch (BrokenBarrierException e) {

e.printStackTrace();

}

}

}

java线程栅栏_java 线程栅栏相关推荐

  1. java线程触发_java线程

    线程. 状态 新建状态(New): 当用 new 操作符创建一个线程时, 例如 new Thread(r),线程还没有开始运行,此时 线程处在新建状态. 当一个线程处于新生状态时,程序还没有开始运行线 ...

  2. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  3. 线程池 java 新建方式_Java线程池的四种创建方式

    Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...

  4. java中我爱你_Java线程学习(转)

    编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:s ...

  5. java 线程状态_JAVA线程漫谈:线程状态与状态转换解析

    线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...

  6. java 线程状态_Java线程为何没有Running状态?我猜你不知道。

    作者:国栋原文:https://my.oschina.net/goldenshaw/blog/705397 Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言, ...

  7. java线程分类_Java 线程类别

    Java 线程类别 守护线程和非守护线程 守护线程和非守护线程之前的唯一区别在于:是否阻止JVM的正常退出. JVM正常退出是与异常退出相对的概念,异常退出如调用System.exit(status) ...

  8. java runnable 异常_JAVA 线程中的异常捕获

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

  9. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

  10. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(二)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

最新文章

  1. 【C语言】一些简单编译错误或警告
  2. Java中Image类与ImageIcon类的区别
  3. form表单中的常用控件
  4. purdue university some course and papers
  5. 高通写号工具_高通推出桌面平台新ARM处理器并认为我们的电脑性能没必要那么高...
  6. mysql 字符串搜_mysql – 在表中搜索字符串的SQL查询?
  7. flowable实战(一)flowable与spring boot集成
  8. 使用jfreechart来创建一个简单的柱状图
  9. 利用根轨迹法进行控制系统的分析和设计
  10. 一个简单的基于 DirectShow 的播放器 2(对话框类)
  11. python3 selenium 点击_python3 selenium使用
  12. 2021-06-0贪吃蛇练习
  13. 电子设计从零开始(1)
  14. YOLOv2论文理解
  15. 南阳oj 韩信点兵
  16. 给大家分享一篇 tkinter python(图形开发界面)
  17. CSS反爬获取伪元素的值
  18. 利用simhash来进行文本去重复
  19. 致我们终将逝去的高考
  20. windows安装kerberos,及通常问题解决

热门文章

  1. canva怎么拼接图片_canvas图片拼接(横向)
  2. Android 读取bin文件方法
  3. python古诗词风格分析_鉴赏古诗词语言风格
  4. 数组中除一个元素外其他所有元素出现二或三次,找到只出现一次的元素
  5. MediaSession框架全解析
  6. 一键设置 DeviceAdmin/ProfileOwner/DeviceOwner 应用
  7. Header Editor 插件下载、使用
  8. Windows10彻底关闭休眠功能
  9. 写代码的时候图片显示不出来怎么办?
  10. 本地Web服务器环境-Wampserver下载