zoukankan      html  css  js  c++  java
  • 026 并发辅助工具--CountDownLatch

    一 .概述

      在前面我们时候说到了使用Condition实现线程的精确控制,但是我们在日常使用的时候我们发现我们的并发总是有一些规律.

      比如在某些线程完成任务之后,该线程才开始,这样的场景总是并发场景中经常出现的.

      为此,JUC提供了并发的辅助类帮助我们简化这种线程并发场景的实现.


    二 . CountDownLatch

      我们首先看一下这个类的结构:

      构造函数:

    public CountDownLatch(int count) 

    其中int值表示需要等待的信号量的数量.

    public void countDown()

    减少一个信号量,表示等待的线程的数量减少一.

     public void await()

    是线程阻塞,直到线程获取到足够的获取到足够的信号量.

      总的来说,我们可以将CountDownLatch比作一个火箭发射器,信号数量不断减少,5,4,3,2,1.然后阻塞的线程就启动了.


    三 . 实例演示 

    public class CountDownLathchTest {
        
        //
        
        public static void main(String[] args) {
            //创建了一个CountDownLatch,其中参数表示需要信号量的数量为10
            CountDownLatch latch = new CountDownLatch(10);
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    //定义的主线程阻塞了
                    try {
                        latch.await();
                        System.out.println("我终于可以运行了..");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
            //下面开启10个线程,每一个线程释放一个信号量.
            for(int x = 0 ; x<10;x++) {
                final int temp = x ; 
                new Thread(()-> {
                    try {
                        TimeUnit.SECONDS.sleep(temp);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //释放一个信号量
                    System.out.println(temp+"线程释放了信号量");
                    latch.countDown();
                }) .start();
            }
        }
    }

    我们观看运行的结果可以看到,我们定义的主线程需要等待10个信号量的释放才能运行.


    四 .作用

      CountDownLatch能做什么呢? 

      首先它可以启动线程任务,但是需要足够的信号量,这也就是说,我们可以通过释放信号量来启动一个线程任务的运行.

      总的来说,这个类相当简单,但是效果却很明显. 


    五 .实现

      没什么的,AQS就是实现的方式.其中AQS中的int就表示的这个信号量的数量.

  • 相关阅读:
    Documents
    gitlab 安装和配置
    git相关知识
    马俊龙ansible教程分享
    源码安装python 报错,openssl: error while loading shared libraries: libssl.so.1.1
    jumpserver 常见错误解决
    nginx 定义:响应头和请求头
    gcc入门(下)
    gcc入门(上)
    awk命令
  • 原文地址:https://www.cnblogs.com/trekxu/p/9010761.html
Copyright © 2011-2022 走看看