简介

在这里模仿CyclicBarrier,自定义一个自己多线程屏障类,里面有个计时器count,count为0时,才唤醒线程,否则就await挂起,(没错就是用的object类的挂起和唤醒全部线程方法)

1、MyCyclicBarrier

package com.jacky;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; /**
* Created by jacky on 2018/2/11.
*/
public class MyCyclicBarrier {
private int count;
private int parties;
private Runnable barrierAction; private final ReentrantLock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); public MyCyclicBarrier(int parties,Runnable barrierAction){
if (parties <=0){
throw new IllegalArgumentException();
}
this.parties = parties;
this.count = parties;
this.barrierAction = barrierAction;
}
public int await() throws InterruptedException,BrokenBarrierException {
lock.lock();
try {
int index = --count;
if (index ==0){
if (null == barrierAction){
barrierAction.run();
}
condition.signalAll();
return index;
}
for (;;){
condition.await();
return index;
}
}finally {
lock.unlock();
}
}
}

2、测试

package com.jacky;

import com.sun.org.apache.xpath.internal.SourceTree;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; /**
* Created by jacky on 2018/2/11.
*/
public class CyclicBarrierDemo {
public static void main(String[] args) throws InterruptedException {
MyCyclicBarrier barrier = new MyCyclicBarrier(3, new Runnable() {
@Override
public void run() {
Thread thread = Thread.currentThread();
System.out.println("barrierAction start"+thread.getName());
try {
Thread.sleep((int)Math.random()*300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("barrierAction start"+thread.getName());
}
});
Runnable runnable1 = new Runnable() {
@Override
public void run() {
try {
Thread.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread thread = Thread.currentThread();
System.out.println("thread start:"+thread.getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("thread end:"+thread.getName());
}
};
Runnable runnable2 = new Runnable() {
@Override
public void run() {
try {
Thread.sleep((int)(Math.random()*200));
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread thread = Thread.currentThread();
System.out.println("thread start:"+thread.getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("thread end:"+thread.getName());
}
};
Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable2);
Thread thread3 = new Thread(runnable1);
thread1.start();
thread2.start();
thread3.start();
Thread.sleep(2000);
System.out.println("thread1:"+thread1.getName()+","+thread1.getState());
System.out.println("thread2:"+thread2.getName()+","+thread2.getState());
System.out.println("thread3:"+thread3.getName()+","+thread3.getState());
}
}

模仿CyclicBarrier,自定义自己屏障类的更多相关文章

  1. CyclicBarrier回环屏障深度解析

    1. 前沿 从上一节的CountDownLatch的学习,我们发现其只能使用一次,当state递减为0后,就没有用了,需要重新新建一个计数器.那么我们有没有可以复用的计数器呢?当然,JUC包给我们提供 ...

  2. Android 自定义Activity基类与TitleBar

    我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字.TitleBar上的点击事件,如果给每一个Activity都写一遍 ...

  3. hadoop编程小技巧(5)---自定义输入文件格式类InputFormat

    Hadoop代码测试环境:Hadoop2.4 应用:在对数据需要进行一定条件的过滤和简单处理的时候可以使用自定义输入文件格式类. Hadoop内置的输入文件格式类有: 1)FileInputForma ...

  4. WPF自定义窗口基类

    WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义.继承自定义窗口的类xaml文件的根节点就不再是<Window>,而是自定义窗口类名(若自定义窗口与继承者不在同一个命名 ...

  5. Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  6. 利用NSUserdefaults来存储自定义的NSObject类及自定义类数组

    利用NSUserdefaults来存储自定义的NSObject类及自定义类数组 1.利用NSUserdefaults来存储自定义的NSObject类 利用NSUserdefaults也可以来存储及获取 ...

  7. 安卓开发37:自定义的HorizontalScrollView类,使其pageScroll的时候焦点不选中

    自定义一个HorizontalScrollView类,主要为了让这个HorizontalScrollView不能鼠标点击,不能左右按键,并且没有焦点. public class ImageMoveHo ...

  8. WPF自学入门(九)WPF自定义窗口基类

    今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...

  9. java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类

    package cn.kecheng; import java.util.Scanner; /**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中 ...

随机推荐

  1. python的time模块总结

    python的time模块与random模块 目录 time模块 time模块 三种时间表示 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp) : 通常来说,时间戳表示的是 ...

  2. Springboot 2.0.x 引入链路跟踪Sleuth及Zipkin

    Zipkin是一种分布式跟踪系统,它有助于收集解决微服务架构中得延迟问题所需的时序数据,它管理这些数据的收集和查找. 1. 架构概述 跟踪器存在于您的应用程序中,并记录有关发生的操作的时间和元数据.他 ...

  3. 洛谷.1486.[NOI2004]郁闷的出纳员(Splay)

    题目链接 /* BZOJ1503: 3164kb 792ms/824ms(新建节点) 洛谷 : 3.06mb 320ms/308ms(前一个要慢wtf 其实都差不多,但前者好写) 四种操作: A:所有 ...

  4. Python3正则表达式(4)

    正则表示式的子模式 使用()表示一个子模式,括号中的内容作为一个整体出现. (red)+  ==> redred, redredred, 等多个red重复的情况 子模式的扩展语法 案例1 tel ...

  5. stm32与HC-SR04超声波传感器测距

    首先,先来看一下这个模块的基本功能和原理. HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm:模块包括超声波发射器.接收器与控制电路.像智能小车的测距 ...

  6. Linux学习笔记14—文件的压缩与打包

    1..gz   gzip 压缩工具压缩的文件 .bz2   bzip2 压缩工具压缩的文件 .tar   tar 打包程序打包的文件(tar并没有压缩功能,只是把一个目录合并成一个文件) .tar.g ...

  7. awk 入门教程

    作者: 阮一峰 日期: 2018年11月 7日   awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序. 它依次处理文件的每一行,并读取里面的每一个字段.对于日志.CSV 那 ...

  8. MyEclipse设置文件的编码格式

    在MyEclipse中复制properties文件的时候,发现一个问题,在EditPlus中打开文件中文可以正常显示,并且是UTF-8的编码格式. 但是将这个文件复制到MyEclipse中再打开时,中 ...

  9. 使用 ssmtp 於 shell 透過 Gmail 寄信

    有很多程式於 bash shell 執行, 執行完要自動寄信出去, 但是最近都被 Google 退信, 最好的方法是透過 Gmail 直接寄信. 本來是要另外寫隻 script 來做這種事, 剛剛發現 ...

  10. js 获取浏览器/网页宽度高度整理

    网页宽度.高度: 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.bo ...