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就表示的这个信号量的数量.

猜你喜欢

转载自www.cnblogs.com/trekxu/p/9010761.html