CountDownLatch的使用说明

CountDownLatch的使用说明

CountDownLatch这个类正如名字所表达的意思,倒计时锁。它允许一个或多个线程等待直到这个锁倒计时完毕。

一个CountDownLatch用给定的数字进行初始化,这个数字可以看成是倒计时的时长。await方法会阻塞线程,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的线程调用await方法,都会被立即返回,表示已经没有锁了。 这个倒计时锁是一次性的,计数无法重置。 如果想要可以重置计数的版本,请考虑使用CyclicBarrier

CountDownLatch是一种通用的同步工具,可用于多种用途。 例如控制多个线程同时执行。又或者让所有线程都执行完毕后,才执行后续的代码。

构造方法

CountDownLatch只有一个构造方法,这个构造方法传入一个整数,这个整数就是倒计时的计数。

常用方法

await,这个方法用于阻塞线程。这个方法进行了重载,一个方法是空参的,一个是带过期时间参数的。这个方法只有三个情况下才会返回true,如下所示:

  1. 记数变成0
  2. 线程被中断
  3. 过期(这个情况只在有过期的方法才生效)

countDown方法用于减少计数,每次减一。

getCount方法用于返回当前的计数。

使用示例

package com.wangguitang.freedom.interview.java.concurrent;

import org.junit.jupiter.api.Test;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 倒计时锁的测试
 *
 * @author freedom wang
 * @date 2021-04-07 23:18:33
 */
public class CountDownLatchTest {

    /**
     * 模拟多个线程同时执行的场景
     *
     * @author freedom wang
     * @date 2021-04-07 23:32:28
     */
    @Test
    public void test1(){
        ExecutorService executorService = Executors.newCachedThreadPool();
        CountDownLatch countDownLatch = new CountDownLatch(1);

        for (int i = 0; i < 10; i++) {
            executorService.submit(()->{
                try {
                    countDownLatch.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println(System.currentTimeMillis());
            });
        }

        countDownLatch.countDown();
    }

    /**
     * 模拟所有线程执行完成后执行的场景
     *
     * @author freedom wang
     * @date 2021-04-07 23:40:15
     */
    @Test
    public void test2(){
        int threadCount = 10;
        ExecutorService executorService = Executors.newCachedThreadPool();
        CountDownLatch countDownLatch = new CountDownLatch(threadCount);

        for (int i = 0; i < threadCount; i++) {
            executorService.submit(()->{
                System.out.println("执行线程逻辑");
                countDownLatch.countDown();
            });
        }

        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("所有线程执行完后执行");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值