打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
CountDownLatch&CyclicBarrier&Semaphore

本文将介绍一下CountDownLatch 、 CyclicBarrier 、 Semaphore这几个控制线程的类。


CountDownLatch 

1、是什么?
这是一个计数器,而且是倒计时。就像火箭发射,10,9,8,……,0,到了0火箭才会发射。这个也一样,当里面的线程执行完,外面的线程才会执行。用一句话讲就是:秦灭六国,一统华夏。灭六国是是六个线程,等这六个线程执行完,一统华夏这个线程才能进行。

2、怎么用?

  • 创建CountDownLatch对象,CountDownLatch count = new CountDownLatch(6);参数表示需要执行的线程的数量;

  • 每执行完一个线程,count.countDown()

  • 需要等待的线程count.await()

3、用之前怎么样?
话不多说,直接撸代码:

1public static void main(String[] args) throws Exception{
2        for (int i = 1; i <= 6; i++) {
3            final int temp = i;
4            new Thread(() -> {
5                System.out.println("第 " + temp + "个国家被灭!");
6            }, "i").start();
7        }
8        System.out.println("六国被灭,秦一统华夏!");
9}

我们的本意是:循环里面的六个线程执行完,主线程才能输出“六国被灭,秦一统华夏!”这句换,看看执行结果是否如尝所愿:

运行结果

才灭了三个国家,那统一个锤子。

4、用之后怎么样?

 1 public static void main(String[] args) throws Exception{
2        CountDownLatch count = new CountDownLatch(6);
3        for (int i = 1; i <= 6; i++) {
4            final int temp = i;
5            new Thread(() -> {
6                System.out.println("第 " + temp + "个国家被灭!");
7                count.countDown();
8            }, "i").start();
9        }
10        count.await();
11        System.out.println("六国被灭,秦一统华夏!");
12 }
运行结果


这就符合了预期。

CyclicBarrier

1、是什么?
上面说的CountDownLatch 是倒计数,那么这个就是顺数的。一句话:集齐七颗龙珠,才能召唤神龙。只有集龙珠这七个线程执行完,召唤神龙的线程才能执行。

2、怎么用?

  • 创建对象,两个参数(1、集多少颗龙珠,2、new 一个线程,执行集齐龙珠后要做的事),CyclicBarrier barrier = new CyclicBarrier(7,() -> {System.out.println("集齐七颗龙珠,召唤神龙!");});

  • 每执行完一个线程,barrier.await()

3、用之前怎么样?

1 public static void main(String[] args) throws Exception{
2        for (int i = 1; i <= 7; i++) {
3            final int temp = i;
4            new Thread(() -> {
5                System.out.println("收集到第 " + temp + "颗龙珠!");
6            }, "i").start();
7        }
8        System.out.println("集齐七颗龙珠,召唤神龙!");
9 }
运行结果


可以看到,才收集到一颗龙珠,就召唤神龙,那能召唤出来?别做梦了。

4、用之后怎么样?

 1 public static void main(String[] args) throws Exception{
2        CyclicBarrier barrier = 
3             new CyclicBarrier(7,() -> {System.out.println("集齐七颗龙珠,召唤神龙!");});
4        for (int i = 1; i <= 7; i++) {
5            final int temp = i;
6            new Thread(() -> {
7                System.out.println("收集到第 " + temp + "颗龙珠!");
8                try {
9                    barrier.await();
10                } catch (Exception e) {
11                    e.printStackTrace();
12                }
13            }, "i").start();
14        }
15    }
运行结果


这才是召唤神龙的正确操作!

Semaphore

1、是什么?
顺数计数和倒数技术都有了,那这个Semaphore是什么鬼?翻译过来意思是信号灯。一句话:抢车位。有三个车位,现在有六辆车。那么先是六辆车去抢三个车位,没抢到的就等着。等车位里面的车走了一辆,那么等待车就可以进去一辆。

2、怎么用?

  • 创建对象,一个参数(车位的数量),

  • 抢车位,semaphore.acquire();

  • 离开车位,semaphore.release();

代码说话:

 1public static void main(String[] args) throws Exception{
2        Semaphore semaphore = new Semaphore(3);
3        for (int i = 1; i <= 6; i++) {
4            final int temp = i;
5            new Thread(() -> {
6                try {
7                    semaphore.acquire();
8                    System.out.println("第 " + temp + "辆车抢到车位!");
9                    TimeUnit.SECONDS.sleep(3);
10                    System.out.println("3秒后第" + temp + "辆车离开车位!");
11                    semaphore.release();
12                } catch (InterruptedException e) {
13                    e.printStackTrace();
14                }
15            }, "i").start();
16        }
17}
运行结果

符合预期,一开始进去三辆,然后等有车离开了其他的才能进去。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
java多线程的工具
Java并发编程高级内容介绍
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发工具类:CyclicBarrier和CountDownLatch | Aoho''s Blog
面试官:说说CountDownLatch,CyclicBarrier,Semaphore的原理?
多线程下的锁
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服