首页 > 其他分享 >【CountDownLatch】

【CountDownLatch】

时间:2024-03-25 18:02:35浏览次数:17  
标签:System long 线程 CountDownLatch new 执行

CountDownLatch是一个计数器,允许一个或多个线程等待某些操作完成后在同时执行。当计数器等于0时,等待的线程才可以同时执行。
例如:CountDownLatch status= new CountDownLatch(5);意味着定义了5个计数器的CountDownLatch;
主要方法:

  1. await 方法:当线程调用该方法后,线程会立即处于阻塞状态;直至 CountDownLatch 的计数器数量变为 0 后,才会继续执行。
  2. await(long timeout, TimeUnit unit):与 await 类似,但是它存在一个超时时间,当到达超时时间后,无论 CountDownLatch 是否变为 0,该方法都会跳出阻塞,继续向下执行。
  3. countDown 方法:对CountDownLatch中计数器的数量减 1。
import java.util.concurrent.CountDownLatch;

/**
 * 功能描述:
 *
 * @author: ys
 */

import lombok.SneakyThrows;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * 功能描述:
 *
 * @author: ys
 */
public class CountDownLatchTest {
    public long task(int nThread, Runnable task) throws InterruptedException {
        final CountDownLatch start = new CountDownLatch(1);
        final CountDownLatch end = new CountDownLatch(nThread);
        for (int i = 0; i < nThread; i++) {
            Thread t = new Thread() {
                @Override
                public void run() {
                    try {
                        //阻塞,先进行记时
                        start.await();
                        try {
                            //执行子线程任务
                            task.run();
                        } finally {
                            //子线程任务计数减一
                            end.countDown();
                        }
                    } catch (InterruptedException e) {
                    }
                }
            };
            t.start();
        }
        //记时开始
        long startTime = System.currentTimeMillis();
        //计数减一
        start.countDown();
        //等待所有的子线程执行完毕
        end.await();
        System.out.println("子线程全部结束了");
        long endTime = System.currentTimeMillis();
        long time = endTime - startTime;
        return time;

    }
    public static void main(String[] args) {
        CountDownLatchTest countDownLatchTest = new CountDownLatchTest();
        try {

            long time = countDownLatchTest.task(4, new Runnable() {
                @SneakyThrows
                @Override
                public void run() {
                    TimeUnit.SECONDS.sleep(2);
                    System.out.println("子线程执行");
                }
            });
            System.out.println("耗时:" + time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}


执行结果:
子线程执行
子线程执行
子线程执行
子线程执行
子线程全部结束了
耗时:2016

标签:System,long,线程,CountDownLatch,new,执行
From: https://blog.csdn.net/qq_40353040/article/details/137018683

相关文章

  • JUC系列之(五)CountDownLatch闭锁
    CountDownLatch闭锁闭锁:延迟当前线程的进度,直到其他线程都执行完成当前线程才继续执行。示例:计算多线程操作耗费时间以下操作时无法正常计算多线程操作耗时的packagecom.atguigu.juc;publicclassTestCountDownLatch{publicstaticvoidmain(String[]args){......
  • 通信工具类countdownlatch和cyclicbarrier
    类作用semaphore限制线程数量exchanger两个线程交换数据countdownlatch递减屏障,线程等待直到计数器减为0时开始工作cyclicbarrier循环屏障,等屏障的线程数达到初始化值时,执行自定义的任务phaser增强的cyclicbarriercountdownlatch和cyclicbarrier区......
  • Java并发基础:CountDownLatch全面解析!
    内容概要CountDownLatch的优点在于能够简洁高效地协调多个线程的执行顺序,确保一组线程都完成后才触发其他线程的执行,适用于资源加载、任务初始化等场景。它提供了清晰的等待/通知机制,易于理解和使用,是提升多线程程序性能和可靠性的重要工具。核心概念CountDownLatch是java.util......
  • CountDownLatch源码解析
    CountDownLatch源码解析countdown是倒计时的意思,latch是门闩的意思,也有门锁的意思,合起来字面意思就是一个倒计树计锁器的意思,先来看一个具体的案例分析大致了解importjava.util.concurrent.CountDownLatch;publicclassMain{publicstaticvoidmain(String[]args)......
  • Java | 多线程并发编程CountDownLatch实践
    关注:CodingTechWork引言  在一次数据割接需求中,数据需要通过编程的方式进行转移割接到新平台,此时若串行化方式,无疑会拉锯此次战斗,所以首当其冲要使用并发编程来降低割接时长。  本次主要考虑使用CountDownLatch工具类进行并发编程的控制。CountDownLatch概述  在并发编程过程......
  • 知道CountDownLatch是做什么的,那你知道它的底层是如何实现的吗?
    一、概述CountDownLatch是一个多线程控制工具,用来控制线程的等待。设置需要countDown的数量num,然后每一个线程执行完毕后,调用countDown()方法,而主线程调用await()方法执行等待,直到num个子线程执行了countDown()方法,则主线程解除阻塞,开始继续执行。其具体操作流程类似火箭发射,我们......
  • 《面试1v1》CountDownLatch 和 CyclicBarrier
    我是javapub,一名Markdown程序员从......
  • CyclicBarrier和CountDownLatch有什么区别?Semaphore(信号量)了解吗?
    一、CyclicBarrier和CountDownLatch有什么区别?两者最核心的区别:CountDownLatch是一次性的,而CyclicBarrier则可以多次设置屏障,实现重复利用;CountDownLatch中的各个子线程不可以等待其他线程,只能完成自己的任务;而CyclicBarrier中的各个线程可以等待其他线程二、Semaphore(信号量)Sema......
  • Java并发工具类CountDownLatch(倒计数器)
    CountDownLatch,倒计数器,有两个常见的应用场景:场景1:协调子线程结束动作:等待所有子线程运行结束CountDownLatch允许一个或多个线程等待其他线程完成操作。例如,我们很多人喜欢玩的王者荣耀,开黑的时候,得等所有人都上线之后,才能开打。CountDownLatch模仿这个场景:创建大乔、兰陵王、安......
  • CountDownLatch、CyclicBarrier、Semaphore面试讲解
    @TOC<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">这三个也是面试常问的,作为线程通信的方法1.CountDownLatch(CDL)主要是用于一个线程等待其他完成后才继续执行。主要方法:await()、countDown()CountDownLatchcdl=newCountDownLatch(2);//第一......