【JUC】CountDownLatch你真的了解吗?

背景

在平时的开发中,我们如何让各个线程间协调工作呢?
除了我们经常使用的线程同步锁Sychronized,ReentrantLOcak的使用,还有线程自有方法,sleep,yeid的使用。哪还有那些高级的使用呢?那就是JUC包中的CountDownLatch,CyclicBarrier,Semaphore。今天我们先了解一下CountDownLatch的使用。

CountDownLatch

1. 权威指南

  • 一种同步帮助,允许一个或多个线程等待,直到其他线程中执行的一组操作完成为止。
    一个CountDownLatch初始化为给定数。该await方法将阻塞,直到由于该countDown()方法的调用导致当前计数达到零为止,此后所有等待线程被释放,并且随后的所有awaitreturn 调用都将立即释放 。这是一种一次性现象-无法重置计数。如果您需要用于重置计数的版本,请考虑使用CyclicBarrier。
  • 类介绍
    在这里插入图片描述

2. 代码演示

package JUC;

import lombok.Data;
import lombok.SneakyThrows;
import org.omg.PortableServer.THREAD_POLICY_ID;

import java.util.concurrent.CountDownLatch;

/**
 * @authoryuanxindong
 * @date: 2020/6/16 10:18 下午
 */
public class CountDownLatchDemo implements Runnable{
    private static final  int DownLatchCount = 3;
    private  int  timeOut;
    public CountDownLatchDemo(int timeOut){
        this.timeOut = timeOut;
    }

   static final CountDownLatch latch = new CountDownLatch(DownLatchCount);
    public static void main(String[] args) {
        // 创建多个线程,且每个线程的sleep的时间是不一致的
        CountDownLatchDemo countDownLatchDemo = new CountDownLatchDemo(1000);
        Thread thread = new Thread(countDownLatchDemo);
        CountDownLatchDemo countDownLatchDemov2 = new CountDownLatchDemo(3000);
        Thread thread1 =new  Thread(countDownLatchDemov2);
        CountDownLatchDemo countDownLatchDemov3 = new CountDownLatchDemo(4000);
        Thread thread2 =new  Thread(countDownLatchDemov3);
        long start = System.currentTimeMillis();
        thread.start();
        thread1.start();
        thread2.start();

        try {
            System.out.println("等待"+DownLatchCount+"个子线程执行完毕...");
            latch.await();
            System.out.println(DownLatchCount+"个子线程已经执行完毕");
            long time = System.currentTimeMillis()-start;
            System.out.println("time:"+ time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @SneakyThrows
    @Override
    public void run() {
        Thread.sleep(timeOut);
        System.out.println("yuanxindongO"+Thread.currentThread().getName());
        latch.countDown();
    }
}


  • 通过启用三个线程,然后给每个线程一个运行时间通过sleep来控制。分别是1000和3000和4000
  • countDownLatch的作用是可以等待所有线程达到执行初始定义的次数,就可以释放阻塞,接着完成主线程。
  • 执行结果:
    在这里插入图片描述

总结

  • 允许一个或多个线程等待某些操作完成(完美!!!!)

参考资料

  • https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/CountDownLatch.html
  • https://time.geekbang.org/column/article/9373
  • https://www.cnblogs.com/dolphin0520/p/3920397.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值