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

本文介绍如何使用并发工具类CountDownLatch和CyclicBarrier进行接口并发量测试。CountDownLatch用于控制并发发生,CyclicBarrier则由线程自身控制并发。两者区别在于CountDownLatch允许未参与并发的线程购票但不上船,而CyclicBarrier要求线程购票并上船才能触发并发。

怎么使用并发工具类–CountDownLatch/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 需要先上船后买票,最后开船之后,船上的

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

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

线程相关知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值