开发者社区> 问答> 正文

代码描述在Java语言中,多线程中CountDownLatch的用法

代码描述在Java语言中,多线程中CountDownLatch的用法

展开
收起
huc_逆天 2021-01-11 11:09:55 676 0
1 条回答
写回答
取消 提交回答
  • 技术架构师 阿里云开发者社区技术专家博主 CSDN签约专栏技术博主 掘金签约技术博主 云安全联盟专家 众多开源代码库Commiter

    一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

    用给定的计数初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。

    public class Main {
        protected static ExecutorService scheduler = Executors.newFixedThreadPool(5);
        public static CountDownLatch countDownLatch;//定义一个静态的CountDownLatch
        public static void main(String[] args) {
            countDownLatch = new CountDownLatch(5); //初始化容量,
            int threadNum = taskNum>8?8:taskNum;  //创建八个线程,和cpu数目相等
            for(int i=0;i<taskNum;i++){
                scheduler.execute(new MultiThread());  //启动多个线程
            }
            try {
                countDownLatch.await();   //等待子线程全部执行结束(等待CountDownLatch计数变为0)
                logger.info("main thread exit");
                System.exit(0);//程序退出
            } catch (InterruptedException e) {
                System.exit(1); 
                e.printStackTrace();
            }
        }
    }
    
    public class MultiThread implements Runnable {
        public void run() {
            logger.info(" starting...");
            try {
                //do what you wanna do 
            } catch (Exception e) {
                logger.error("", e);
            }finally{
                logger.info("countDown"); 
                AppDependenciesMain.countDownLatch.countDown();//线程运行结束后,把countDownLatch数目减1
            }
        }
    }
    
    2021-01-11 11:10:21
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
多IO线程优化版 立即下载