java线程栅栏_java 线程栅栏
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 线程栅栏相关推荐
- java线程触发_java线程
线程. 状态 新建状态(New): 当用 new 操作符创建一个线程时, 例如 new Thread(r),线程还没有开始运行,此时 线程处在新建状态. 当一个线程处于新生状态时,程序还没有开始运行线 ...
- java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...
导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...
- 线程池 java 新建方式_Java线程池的四种创建方式
Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...
- java中我爱你_Java线程学习(转)
编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:s ...
- java 线程状态_JAVA线程漫谈:线程状态与状态转换解析
线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...
- java 线程状态_Java线程为何没有Running状态?我猜你不知道。
作者:国栋原文:https://my.oschina.net/goldenshaw/blog/705397 Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言, ...
- java线程分类_Java 线程类别
Java 线程类别 守护线程和非守护线程 守护线程和非守护线程之前的唯一区别在于:是否阻止JVM的正常退出. JVM正常退出是与异常退出相对的概念,异常退出如调用System.exit(status) ...
- java runnable 异常_JAVA 线程中的异常捕获
在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...
- idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)
课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...
- idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(二)
课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...
最新文章
- 【C语言】一些简单编译错误或警告
- Java中Image类与ImageIcon类的区别
- form表单中的常用控件
- purdue university some course and papers
- 高通写号工具_高通推出桌面平台新ARM处理器并认为我们的电脑性能没必要那么高...
- mysql 字符串搜_mysql – 在表中搜索字符串的SQL查询?
- flowable实战(一)flowable与spring boot集成
- 使用jfreechart来创建一个简单的柱状图
- 利用根轨迹法进行控制系统的分析和设计
- 一个简单的基于 DirectShow 的播放器 2(对话框类)
- python3 selenium 点击_python3 selenium使用
- 2021-06-0贪吃蛇练习
- 电子设计从零开始(1)
- YOLOv2论文理解
- 南阳oj 韩信点兵
- 给大家分享一篇 tkinter python(图形开发界面)
- CSS反爬获取伪元素的值
- 利用simhash来进行文本去重复
- 致我们终将逝去的高考
- windows安装kerberos,及通常问题解决