Java CountDownLatch与CyclicBarrier及Semaphore使用教程

 更新时间:2023年01月04日 08:34:48   作者:欲无缘  
对于并发执行,Java中的CountDownLatch是一个重要的类。为了更好的理解CountDownLatch这个类,本文将通过例子和源码带领大家深入解析CountDownLatch与CyclicBarrier及Semaphore的原理,感兴趣的可以学习一下

CountDownLatch

CountDownLatch是一个倒数的计数器阀门,初始化时阀门关闭,指定计数的数量,当数量倒数减到0时阀门打开,被阻塞线程被唤醒。

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
    // 总数是6,必须要执行任务的时候,再使用    !
    CountDownLatch countDownLatch = new CountDownLatch(6);
    for (int i = 1; i <=6 ; i++) {    
        new Thread(()->{
        System.out.println(Thread.currentThread().getName()+" Go out");
        countDownLatch.countDown(); // 数量-1
        },String.valueOf(i)).start();
    }  
    countDownLatch.await(); // 等待计数器归零,然后再向下执行
    System.out.println("Close Door");
    }
}

原理

countDownLatch.countDown();//数量-1

countDownLatch.await();//等待

每次有线程调用 countDown() 数量-1,假设计数器变为0,countDownLatch.await() 就会被唤醒,继续执行!

CyclicBarrier

CyclicBarrier是一个可循环的屏障,它允许多个线程在执行完相应的操作后彼此等待共同到达一个point,等所有线程都到达后再继续执行。

CyclicBarrier也可以像CountDownLatch一样适用于多个子任务并发执行,当所有子任务都执行完后再继续接下来的工作。

public class CyclicBarrierDemo {
    public static void main(String[] args) {
         // 召唤龙珠的线程
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
            System.out.println("召唤神龙成功!");
        });
        for (int i = 1; i <=7 ; i++) {
            final int temp = i;
            // lambda能操作到 i 吗
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"收集"+temp+"个龙珠");
                try {
                cyclicBarrier.await(); // 等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

Semaphore

Semaphore翻译过来是信号量的意思,它的作用是控制多个线程对同一个资源的访问线程数量。比如在停车场停车,里面有10个车位,当这10个车位被停满的时候其他的车只能等待(堵塞)里面有车驶出(release)然后再进入。

public class SemaphoreDemo {
    public static void main(String[] args) {
        // 线程数量:停车位! 限流!
        Semaphore semaphore = new Semaphore(3);
        for (int i = 1; i <=6 ; i++) {
            new Thread(()->{
            // acquire() 得到
            try {
                semaphore.acquire();
                System.out.println(Thread.currentThread().getName()+"抢到车位");
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName()+"离开车位");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release(); // release() 释放
            }
        },String.valueOf(i)).start();
        }
    }
}

semaphore.acquire();获得,假设如果已经满了,等待,等待被释放为止!

semaphore.release();释放,会将当前的信号量释放 + 1,然后唤醒等待的线程!

作用: 多个共享资源互斥的使用!并发限流,控制最大的线程数!

到此这篇关于Java CountDownLatch与CyclicBarrier及Semaphore使用教程的文章就介绍到这了,更多相关Java CountDownLatch内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java.imageIo给图片添加水印的实现代码

    java.imageIo给图片添加水印的实现代码

    最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印;一下提供下个方法,希望大家可以用得着
    2013-07-07
  • 一文浅析Java中的值传递

    一文浅析Java中的值传递

    今天在解决一个问题时,程序总是不能输出正确值,分析逻辑思路没问题后,发现原来是由于函数传递导致了这个情况,下面我们就来看看Java中的值传递到底是什么情况吧
    2023-08-08
  • Java利用Easyexcel导出excel表格的示例代码

    Java利用Easyexcel导出excel表格的示例代码

    这篇文章主要为大家详细介绍了Java利用Easyexcel导出excel表格的示例代码,文中的代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-07-07
  • SpringBoot参数校验之@Valid的使用详解

    SpringBoot参数校验之@Valid的使用详解

    这篇文章主要通过示例为大家详细介绍一下介绍了SpringBoot参数校验中@Valid的使用方法,文中的示例代码讲解详细,需要的可以参考一下
    2022-06-06
  • SpringBoot使用Validator进行参数校验实战教程(自定义校验,分组校验)

    SpringBoot使用Validator进行参数校验实战教程(自定义校验,分组校验)

    这篇文章主要介绍了SpringBoot使用Validator进行参数校验(自定义校验,分组校验)的实战教程,本文通过示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-07-07
  • 关于Java并发编程中线程间协作的两种方式

    关于Java并发编程中线程间协作的两种方式

    这篇文章主要介绍了关于Java并发编程中线程间协作的两种方式,当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源的占用权,这是消费者模式,需要的朋友可以参考下
    2023-07-07
  • Java IO之包装流详解

    Java IO之包装流详解

    这篇文章主要为大家介绍了Java IO之包装流,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Java多线程之线程安全问题详细解析

    Java多线程之线程安全问题详细解析

    这篇文章主要给大家介绍了关于Java多线程之线程安全问题的相关资料,Java多线程中线程安全问题是一个常见的问题,因为多个线程可能同时访问共享的资源,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • JVM调优实战

    JVM调优实战

    本文主要介绍了JVM调优实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Netty分布式解码器读取数据不完整的逻辑剖析

    Netty分布式解码器读取数据不完整的逻辑剖析

    这篇文章主要为大家介绍了Netty分布式解码器读取数据不完整的逻辑剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03

最新评论