CountDownLatch 使用详解

作者: 一团捞面 | 来源:发表于2018-09-03 23:45 被阅读18次

1. CountDownLatch 是什么?

从这个类的字面意思来入手,CountDown 是倒计时的意思,Latch 是门栓的意思,加起来的意思就是一个倒计时的门栓。

它其实是作用于线程当中的,它就像一个门栓,一开始是关闭的,所有希望通过该门的线程都需要等待,然后开始倒计时,当倒计时一到,等待的所有线程都可以通过。

要注意的是,它是一次性的,打开之后就不能关上了。

2. 怎么使用 CountDownLatch

2.1 构造方法

public CountDownLatch(int count)

解释:

  • count 就是需要等待的线程数量

2.2 重要方法

// 调用此方法的线程会被阻塞,直到 CountDownLatch 的 count 为 0
public void await() throws InterruptedException 

// 和上面的 await() 作用基本一致,只是可以设置一个最长等待时间
public boolean await(long timeout, TimeUnit unit) throws InterruptedException

// 会将 count 减 1,直至为 0
public void countDown() 

2.3 基本使用

2.3.1 需求

现在实现主线程等待其他线程的任务完成之后,才继续执行的代码。

2.3.2 代码实现

public class CountDownLatchDemo {
    
    static class TaskThread extends Thread {
        
        CountDownLatch latch;
        
        public TaskThread(CountDownLatch latch) {
            this.latch = latch;
        }
        
        @Override
        public void run() {
            
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.println(getName() + " Task is Done");
                latch.countDown();
            }
            
            
        }
        
    }
    
    public static void main(String[] args) throws InterruptedException {
        
        int threadNum = 10;
        CountDownLatch latch = new CountDownLatch(threadNum);
        
        for(int i = 0; i < threadNum; i++) {
            TaskThread task = new TaskThread(latch);
            task.start();
        }
        
        System.out.println("Task Start!");
        
        latch.await();
        
        System.out.println("All Task is Done!");
    }

}

代码解释:

  • 设置 CountDownLatch 的等待线程数为 10
  • 开启 10 个线程,每个线程都会睡眠 1 秒,睡眠结束后就会调用 CountDownLatch 的 countDown() 方法
  • 主线程调用 CountDownLatch 的 await() 方法,所以会开始阻塞,直到 CountDownLatch 的 count 为 0 才继续执行

打印结果:

Task Start!
Thread-1 Task is Done
Thread-5 Task is Done
Thread-8 Task is Done
Thread-9 Task is Done
Thread-2 Task is Done
Thread-7 Task is Done
Thread-6 Task is Done
Thread-4 Task is Done
Thread-3 Task is Done
Thread-0 Task is Done
All Task is Done!

3. CountDownLatch 使用场景

3.1 同时启动多个线程

如果想同时启动多个线程,实现最大的并行性,就可以使用 CountDownLatch。稍微修改上面的例子代码,代码如下:

public class CountDownLatchDemo {
    
    static class TaskThread extends Thread {
        
        CountDownLatch latch;
        
        public TaskThread(CountDownLatch latch) {
            this.latch = latch;
        }
        
        @Override
        public void run() {
            
            try {
                latch.await();
                System.out.println(getName() + " start " + System.currentTimeMillis());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } 
        }
        
    }
    
    public static void main(String[] args) throws InterruptedException {
        
        int threadNum = 10;
        CountDownLatch latch = new CountDownLatch(1);
        
        for(int i = 0; i < threadNum; i++) {
            TaskThread task = new TaskThread(latch);
            task.start();
        }
        
        Thread.sleep(1000);
        latch.countDown();

    }

}

代码解释:

  • 设置 CountDownLatch 等待线程数为 1
  • 开启 10 个线程,每个线程都会调用 CountDownLatch 的 await() 方法,这样每个线程都会被阻塞
  • 主线程休眠 1 秒后,调用 CountDownLatch 的 countDown() 方法,调用后就会唤醒所有等待的线程,所有等待的线程就会同时执行

打印结果:

Thread-1 start 1535987605552
Thread-3 start 1535987605552
Thread-2 start 1535987605552
Thread-0 start 1535987605552
Thread-6 start 1535987605552
Thread-5 start 1535987605552
Thread-8 start 1535987605552
Thread-4 start 1535987605552
Thread-9 start 1535987605552
Thread-7 start 1535987605552

3.2 等待多个线程完成各自任务后再开始执行自己的任务

这个例子在 2.3 节已经说过了,这里就不再细说了。

参考文章:

相关文章

  • CountDownLatch 使用详解

    1. CountDownLatch 是什么? 从这个类的字面意思来入手,CountDown 是倒计时的意思,Lat...

  • CountDownLatch详解

      在并发编程中,往往会遇到这样的需求:一个或几个线程必须等到一系列执行前置任务的线程执行完成后才能继续执行,而C...

  • CountDownLatch详解

    CountDownLatch中count down是倒数的意思,latch则是门闩的含义。整体含义可以理解为倒数的...

  • CountDownLatch详解

    功能描述 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。常见用法多个人等一...

  • CountDownLatch详解

    功能描述 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 常见用法 多个人...

  • 8. Java中的并发工具类

    CountDownLatch 作用:等待一个或多个线程执行完成; 使用: CountDownLatch cdl =...

  • JUC并发编程-6.CountDownLatch源码解析

    1.CountDownLatch相关API使用 运行结果 2.CountDownLatch相关API解读 new ...

  • countdown设计模式

    使用JDK自带的countdownLatch

  • Java的CountDownLatch详解及使用案例

    简介 CountDownLatch是Java提供的一种用于多线程协同的工具。 它允许一个或多个线程等待其他线程完成...

  • CountDownLatch 使用

    java.util.concurrent.CountDownLatch是一个并发结构,它允许一个或多个线程等待一组...

网友评论

    本文标题:CountDownLatch 使用详解

    本文链接:https://www.haomeiwen.com/subject/shcwwftx.html