CountDownLatch

这篇具有很好参考价值的文章主要介绍了CountDownLatch。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个类是在java.util.concurrent并发包里面

允许一个或者多个线程一直等待,直到其他线程执行完成后再执行

举例:班长和5名同学都在教室里面写作业,班长必须等五个同学都走了之后,才能把教师门的锁锁上

这是通过一个计数器来实现的,计数器初始化的值为线程的数量,每当一个线程完成了自己的任务之后,计数器的值就减去1,当计数器的值减为0的时候,表示所有线程都完成了任务,此时在CountDownLatch上等待的线程就可以执行了

这个类里面有五个常用方法:

(1)构造方法:表示要等待的线程个数

public CountDownLatch(int count){

}

(2) await()方法,当前线程进入到同步队列中进行等待,直到计数器的值减到0

public  void  await(){

}

(3)带超时时间的await()

public  void  await(long timeout,TimeUnit unit){

}

(4)countDown() 方法,使计数器的值减1

public  void  countDown(){

}

(5)getCount()方法,获取计数器的值

public  void  getCount(){

}

示例;

初始化CountDownLatch的计数器值为 5

每个线程执行完,计数器的值就减1,最后减为0

运行到countDownLatch.await();这一行的时候会检查计数器的值,只要值不为0,当前线程(也就是主线程会进入阻塞态)

public class testCountDownLatch {
    public static void main(String[] args){

        ExecutorService executorService= Executors.newFixedThreadPool(5);//创建大小为5的线程池

        CountDownLatch countDownLatch=new CountDownLatch(5);

        for(int i=0;i<5;i++)
        {
            executorService.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" is running");
                    TimeUnit.SECONDS.sleep(1);//模拟执行业务
                    System.out.println(Thread.currentThread().getName()+" is over");
                    countDownLatch.countDown();})
               
        }

        countDownLatch.await();
        System.out.println(Thread.currentThread().getName()+" is running");

        executorService.shutdown();//销毁线程池
    }
}

执行结果:文章来源地址https://www.toymoban.com/news/detail-460968.html

pool-1-thread-1 is running
pool-1-thread-5 is running
pool-1-thread-4 is running
pool-1-thread-2 is running
pool-1-thread-3 is running
pool-1-thread-4 is over
pool-1-thread-1 is over
pool-1-thread-5 is over
pool-1-thread-3 is over
pool-1-thread-2 is over
main is running

到了这里,关于CountDownLatch的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 已解决java.util.concurrent.ExecutionException异常的正确解决方法,亲测有效!!!

    已解决java.util.concurrent.ExecutionException异常的正确解决方法,亲测有效!!! java.util.concurrent.ExecutionException java.util.concurrent.ExecutionException是Java多线程编程中常见的异常之一,它表示在执行一个Callable或者Runnable任务时,任务抛出了一个异常。 下滑查看解决方法 具体解决方法可

    2024年02月11日
    浏览(26)
  • 【JavaEE】JUC(java.util.concurrent)的常见类以及线程安全的集合类

    目录 1、JUC(java.util.concurrent)的常见类 1.1、Callable接口的用法(创建线程的一种写法)  1.2、ReentrantLock可重入互斥锁 1.2.1、ReentrantLock和synchronized的区别  1.2.2、如何选择使用哪个锁 1.3、Semaphore信号量 1.4、CountDownLatch  2、线程安全的集合类 2.1、多线程环境使用ArrayList  2.2、

    2024年02月07日
    浏览(37)
  • 关于报错java.lang.reflect.InaccessibleObjectException: Unable to make field private java.util.concurrent

    java.lang.reflect.InaccessibleObjectException: Unable to make field private java.util.concurrent.Callable java.util.concurrent.FutureTask.callable accessible: module java.base does not \\\"opens java.util.concurrent\\\" to unnamed module @32eebfca 假如报这种错误,只需要在Run-Edit Configurations-Modify Options-add VM options中加  假如你报的是下面

    2024年02月15日
    浏览(53)
  • Java - JUC(java.util.concurrent)包详解,其下的锁、安全集合类、线程池相关、线程创建相关和线程辅助类、阻塞队列

    JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题 java.lang.Thread.State tools(工具类):又叫信号量三组工具类,包含有 CountDownLatch(闭锁) 是一个同步辅助类,在完成一组正在其他线程中

    2024年02月05日
    浏览(29)
  • 【问题已解决】Unrecognized option: --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED

    今天在创建java项目时,运行报错,说无法成功创建java程序。 Unrecognized option: --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. 解决办法: 1、使用最新的jdk版本 2、在第三处,选择最新的jdk版本

    2024年02月13日
    浏览(38)
  • idea启动报错Internal error. Please refer to https://jb.gg/ide/critical-startup-errors java.util.concurr

    java.util.concurrent.CompletionException: org.picocontainer.PicoRegistrationException: Key com.tang.intellij.lua.luacheck.LuaCheckSettings duplicated) Internal error. Please refer to https://jb.gg/ide/critical-startup-errors java.util.concurrent.CompletionException: org.picocontainer.PicoRegistrationException: Key com.tang.intellij.lua.luacheck.LuaCheckSetti

    2023年04月17日
    浏览(58)
  • Java_23_并发包

    并发包的来历: 在实际开发中如果不需要考虑线程安全问题,大家不需要做线程安全,因为如果做了反而性能不好! 但是开发中有很多业务是需要考虑线程安全问题的,此时就必须考虑了。否则业务出现问题。 Java为很多业务场景提供了性能优异,且线程安全的并发包,程序

    2024年02月15日
    浏览(41)
  • Java并发体系-第三阶段-JUC并发包-[2]-CompleableFuture,SynchronousQueue

    java7中引入了一种新的可重复使用的同步屏障,称为移相器Phaser。Phaser拥有与 CyclicBarrier 和 CountDownLatch 类似的功能. 但是这个类提供了更加灵活的应用。CountDownLatch和CyclicBarrier都是只适用于固定数量的参与者。移相器适用于可变数目的屏障,在这个意义上,可以在任何时间注册

    2024年02月07日
    浏览(25)
  • 解决java.util.NoSuchElementException

    博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭 《MYSQL从入门到精通》数据库是开发者必会基础之一~ 🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包