模仿CyclicBarrier,自定义自己屏障类
简介
在这里模仿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,自定义自己屏障类的更多相关文章
- CyclicBarrier回环屏障深度解析
1. 前沿 从上一节的CountDownLatch的学习,我们发现其只能使用一次,当state递减为0后,就没有用了,需要重新新建一个计数器.那么我们有没有可以复用的计数器呢?当然,JUC包给我们提供 ...
- Android 自定义Activity基类与TitleBar
我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字.TitleBar上的点击事件,如果给每一个Activity都写一遍 ...
- hadoop编程小技巧(5)---自定义输入文件格式类InputFormat
Hadoop代码测试环境:Hadoop2.4 应用:在对数据需要进行一定条件的过滤和简单处理的时候可以使用自定义输入文件格式类. Hadoop内置的输入文件格式类有: 1)FileInputForma ...
- WPF自定义窗口基类
WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义.继承自定义窗口的类xaml文件的根节点就不再是<Window>,而是自定义窗口类名(若自定义窗口与继承者不在同一个命名 ...
- Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议(转载)
Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...
- 利用NSUserdefaults来存储自定义的NSObject类及自定义类数组
利用NSUserdefaults来存储自定义的NSObject类及自定义类数组 1.利用NSUserdefaults来存储自定义的NSObject类 利用NSUserdefaults也可以来存储及获取 ...
- 安卓开发37:自定义的HorizontalScrollView类,使其pageScroll的时候焦点不选中
自定义一个HorizontalScrollView类,主要为了让这个HorizontalScrollView不能鼠标点击,不能左右按键,并且没有焦点. public class ImageMoveHo ...
- WPF自学入门(九)WPF自定义窗口基类
今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...
- java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类
package cn.kecheng; import java.util.Scanner; /**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中 ...
随机推荐
- Flutter常用组件(Widget)解析-Text
单一格式的文本. 文本组件是以字符串形式显示的单一格式,这个文本字符串可以是多行显示也可以是单独一行显示,主要取决于你的布局限制. 这样式内容是可选择的,如果你省略了,则会使用文本的默认样式来显示.如 ...
- HQL count(*)
public int getTarPage() { String hql = "'"; Query query = getSession().creat ...
- C# 多进制转换
public class Converter { private static String keys = "0123456789abcdefghijklmnopqrstuvwxyzABCD ...
- python 列表返回重复数据的下标
class Solution(object): def searchRange(self, nums, target): """ :type nums: List[int ...
- PLSQL Developer的使用之对象浏览器
PLSQL Developer的使用之对象浏览器 (转自https://www.cnblogs.com/mq0036/p/6437834.html#point11) 能够显示与 PL/SQL 开发相关 ...
- BZOJ.1935.[SHOI2007]Tree园丁的烦恼(CDQ分治 三维偏序)
题目链接 矩形查询可以拆成四个点的前缀和查询(树套树显然 但是空间不够) 每个操作表示为(t,x,y),t默认有序,对x分治,y用树状数组维护 初始赋值需要靠修改操作实现. //119964kb 43 ...
- Java并发程序设计(七)乐天派:无锁
无锁 一.概述 无锁是处理并发的一种乐观策略,它会假设对资源的访问是没有冲突的.既然没有冲突自然不需要等待,所以所有的线程都可以在不停顿的状态下执行.那遇到冲突怎么办?接下来请看,无锁绝招“CAS”即 ...
- Android工程运用阿里freeline10秒快速编译分享
git地址:https://github.com/alibaba/freeline 目前已经更新到0.6.0版本. 原来编译一次需要几分钟甚至几十分钟的android工程,运用freeline,1分钟 ...
- C#编程(七十一)---------- 自定义特性
自定义特性 在说自定义之前,有必要先介绍一些基本的概念. 元数据:就是C#中封装的一些类,无法修改,类成员的特性被称为元数据中的注释 1.什么是特性? (1)属性和特性的区别 属性:属性是面向对象思想 ...
- C#调试心经
我们在做程序开发时,难免会遇到错误异常.如何快速地找到出错的地方.分析错误的原因以及找到解决问题的方案,是许多初级程序员困扰的问题,这也正是经验的宝贵之处.下面我将简单介绍在Visual Studio ...