博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模仿CyclicBarrier,自定义自己屏障类
阅读量:6917 次
发布时间:2019-06-27

本文共 4484 字,大约阅读时间需要 14 分钟。

简介

在这里模仿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());    }}

 

转载地址:http://qexcl.baihongyu.com/

你可能感兴趣的文章
Linux find 用法
查看>>
大型分布式网站架构技术总结
查看>>
十种排序算法的C++泛型实现
查看>>
momgodb 备份与恢复
查看>>
阿里腾讯云物理服务器镜像制作工具
查看>>
linux系统定时重启
查看>>
C++之格式化输出
查看>>
sublime text2 快速生成HTML头部信息Emmet(zen coding)
查看>>
symantec backup exec 备份exchange VSS错误
查看>>
ttlsa教程系列之MySQL---MySQL/Galera集群-多主高可用性负载均衡
查看>>
利用好快捷方式/组合键/鼠标动作,使用桌面工作效率更高
查看>>
DNS初体验之完美邂逅
查看>>
android使用startActivityForResult回传参数
查看>>
怎么在Win7下硬盘安装linux?
查看>>
我的友情链接
查看>>
【HTML+CSS+JavaScript】网页实战开发笔记之二—关于Web标准,你不能不知道的事
查看>>
我的友情链接
查看>>
Web系统Spring/SpringMVC启动完成监控
查看>>
Spring HTTP Invoker使用介绍
查看>>
jpeg note
查看>>