博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CyclicBarrier和CountDownLatch笔记
阅读量:4330 次
发布时间:2019-06-06

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

一、CyclicBarrier的使用

  Barrier是栅栏,障碍物的意思,这里将它理解为栅栏。

  Cyclic是重复利用的意思。

  CyclicBarrier:可重复利用的栅栏。这里附上官方文档的一句解释:The barrier is called<em>cyclic</em> because it can be re-used after the waiting threads are released.

  大概意思是等待的线程被释放以后就可以重新使用这个栅栏。

  

  栅栏的使用条件:它必须使用在线程类中。也就是说你可以把CyclicBarrier作为线程类的一个变量。

  在代码中插入一个栅栏,当代码执行到栅栏处就被拦截住了,不能继续往下执行。一直等到所有的线程都执行到栅栏处,才可以继续执行。

public static void main(String[] args)    {        CyclicBarrier barrier = new CyclicBarrier(10);//设置你要拦截的线程的个数。                for(int i = 0; i < 10; i++)        {            new Thread(new Worker(barrier)).start();            System.out.println("第" + i + "个线程已经启动");                    }    }

线程类中持有CyclicBarrier的引用。

class Worker implements Runnable{    private CyclicBarrier barrier;        public Worker(CyclicBarrier barrier)    {        this.barrier = barrier;    }        @Override    public void run()    {        try        {            Thread.sleep((long)(Math.random() * 10000));        } catch (InterruptedException e)        {            e.printStackTrace();        }                try        {            System.out.println("代码....");            barrier.await();//栅栏,栅栏的启用就是调用await()方法就行了。还可以调用它的重载方法await(long timeout, TimeUnit unit)            System.out.println("代码.....");        } catch (InterruptedException e)        {            e.printStackTrace();        } catch (BrokenBarrierException e)        {            e.printStackTrace();        }                System.out.println("你好");    }}

 

二、CountDownLatch

  感觉CountDownLatch和CyclicBarrier有点相似,所以就记在一起。

  说一下两者的区别,CyclicBarrier的作用是让多个线程都执行到栅栏的时候,这写线程再继续执行,比如,有十个线程,要全部等到这十个线程都到栅栏以后,再各自前进。而CountDownLatch则是用来让多个线程都执行完以后再继续往下执行。比如,在一个主线程中创建了10个线程并启动运行它们。本来的是这十个线程启动完后主线程就可以继续往下执行了,但是现在需要等这十个线程执行完毕以后(更准确的说应该是getCount()的返回值为0的时候)主线程才能往下执行。那么这时候就需要CountDownLatch来完成。

例子:

public class CountDownLatchTest{    public static void main(String[] args)    {        CountDownLatch countDownLatch = new CountDownLatch(5);                for(int i = 0; i < 10; i++)        {            new Thread(new CountDownRun(countDownLatch, i)).start();        }                //需要等到10个线程都执行完以后才能继续往下执行。准确的来说应该是计数器不断减一,当减到0的时候主线程就可以继续往下执行了。        try        {            countDownLatch.await();        } catch (InterruptedException e)        {            e.printStackTrace();        }                System.out.println("await()之后继续执行");    }}

 

class CountDownRun implements Runnable{    private CountDownLatch countDownLatch;//线程持有同一个countDownLatch    private int i;        public CountDownRun(CountDownLatch countDownLatch, int i)    {        this.countDownLatch = countDownLatch;        this.i = i;    }        @Override    public void run()    {        System.out.println("你好!" + i);                try        {            Thread.sleep((long)(Math.random() * 1000));        } catch (InterruptedException e)        {            e.printStackTrace();        }        System.out.println("睡醒了。。。" + i);        countDownLatch.countDown();//减一        System.out.println("减一后");    }}

 三、CountDownLatch还有一种用法,参见类注释。

转载于:https://www.cnblogs.com/GooPolaris/p/8152751.html

你可能感兴趣的文章
第43条:掌握GCD及操作队列的使用时机
查看>>
Windows autoKeras的下载与安装连接
查看>>
CMU Bomblab 答案
查看>>
微信支付之异步通知签名错误
查看>>
2016 - 1 -17 GCD学习总结
查看>>
linux安装php-redis扩展(转)
查看>>
Vue集成微信开发趟坑:公众号以及JSSDK相关
查看>>
技术分析淘宝的超卖宝贝
查看>>
i++和++1
查看>>
react.js
查看>>
P1313 计算系数
查看>>
NSString的长度比较方法(一)
查看>>
Azure云服务托管恶意软件
查看>>
My安卓知识6--关于把项目从androidstudio工程转成eclipse工程并导成jar包
查看>>
旧的起点(开园说明)
查看>>
生产订单“生产线别”带入生产入库单
查看>>
crontab导致磁盘空间满问题的解决
查看>>
java基础 第十一章(多态、抽象类、接口、包装类、String)
查看>>
Hadoop 服务器配置的副本数量 管不了客户端
查看>>
欧建新之死
查看>>