怎么使用并发工具类--CountDownLatchCyclicBarrier

怎么使用并发工具类–CountDownLatch/CyclicBarrier

文章目录

    • 1.CountDownLatch
    • 2.CyclicBarrier

我这里就是简单的介绍使用,并不扩展内部实现的原理(想要了解原理在文章结尾会给对应的链接


1.CountDownLatch

先把一个使用场景说一下 : 我想测试某一个接口能抗住多大的并发量,并且在这个过程中通过通过其他的线程来控制并发发生,那来嘛,搞事情啊!

//1. 整个场景可以想象成一次坐船场景,坐正规观光旅游船,票被买完了,就可以开船了
final int THREAD_MAX = 30 ;
//2. 一共30张票
CountDownLatch CDL = new CountDownLatch(THREAD_MAX);
//有人买票上船,有人买票有事情不上船
//------不上船的
new Thread(new Runnable() {
            @Override
            public void run() {
           		//我买票,但是我不上船,我干其他事情去了
            	CDL.countDown(); 
                System.out.println("["+Thread.currentThread().getName()+"] : 我在泡妞!");
            }
        }).start();
        
//------上船的
new Thread(new Runnable() {
            @Override
            public void run() {
           		//我买票
            	CDL.countDown(); 
            	//我上车了,票卖完了吗?卖完开船喽:没卖完继续卖
            	CDL.await();
                System.out.println("["+Thread.currentThread().getName()+"] : 啊,终于开船了!");
            }
        }).start();

1.CDL 设置要卖多少张船票才开船 ---------new CountDownLatch(“船票数量指标”);

2.XXX 来买了一张船票------- CDL.countDown();

3.YYY 登船,等待开船-------- CDL.await();

4.并发点就在所有船票卖完的时候,所有在船上的人一起出发------这就是并发test的实现

2.CyclicBarrier

再说一个场景:还是测试接口并发量,但是通过并发线程自己来控制并发发生

//线程并发量:6,可以想象成坐黄牛船,6个人才开船
CyclicBarrier cyclicBarrier = new CyclicBarrier(6);
//------
new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                	//验票上船,人数满了吗?没满继续等人:满了就开船
                    cyclicBarrier.await();
                    System.out.println("[" + Thread.currentThread().getName()+"] : weak up");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }).start();

1.一条船要坐6个人-----new CyclicBarrier(6);

2.验票上船,人数满了吗?没满继续等人:满了就开船-------cyclicBarrier.await();

3.并发发生在人数够的那一刻,船出发,所有人全都开始旅程

##3.这2个工具类的区别就在于

区别点在于:CountDownLatch <买票> <上船> 2个动作分开,不一定是同一个人,不一定是一个人,

对于开船这个结果而言,买票这个动作必须,但是上船这个工作非必需,结果就导致开船之后,船上的

人数 <= 票数,人数就是并发量 。 CyclicBarrier 需要先上船后买票,最后开船之后,船上的

人数 == 票数,人数就是并发量。

自己学习的痕迹-代码文件

线程相关知识

你可能感兴趣的:(并发)