首页 > 其他分享 >JUC系列之(五)CountDownLatch闭锁

JUC系列之(五)CountDownLatch闭锁

时间:2024-02-29 19:36:16浏览次数:22  
标签:JUC 闭锁 System start LatchDemo CountDownLatch latch public

CountDownLatch闭锁

闭锁:延迟当前线程的进度,直到其他线程都执行完成当前线程才继续执行。

示例:计算多线程操作耗费时间

以下操作时无法正常计算多线程操作耗时的

package com.atguigu.juc;

public class TestCountDownLatch {
    public static void main(String[] args) {
        LatchDemo latchDemo = new LatchDemo();

        long start = System.currentTimeMillis();
        for (int i = 0; i < 10; i++) {
            new Thread(latchDemo).start();
        }

        long end = System.currentTimeMillis();

        System.out.println(end - start);
    }
}

class LatchDemo implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 50000; i++) {
            if (i % 2 == 0){
                System.out.println(i);
            }
        }
    }
}

使用闭锁改造为如下即可

package com.atguigu.juc;

import java.util.concurrent.CountDownLatch;

public class TestCountDownLatch {
    public static void main(String[] args) {
        // 这里的10要和线程个数一致
        CountDownLatch countDownLatch = new CountDownLatch(10);

        LatchDemo latchDemo = new LatchDemo(countDownLatch);

        long start = System.currentTimeMillis();
        for (int i = 0; i < 10; i++) {
            new Thread(latchDemo).start();
        }

        try {
            // countDownLatch的值为 0 时主线程会继续执行
            countDownLatch.await();
        } catch (InterruptedException e) {
        }

        long end = System.currentTimeMillis();

        System.out.println("耗时:" + (end - start));
    }
}

class LatchDemo implements Runnable{

    private CountDownLatch latch;

    LatchDemo(CountDownLatch latch){
        this.latch = latch;
    }

    @Override
    public void run() {
        synchronized (this) {
            try {
                for (int i = 0; i < 50000; i++) {
                    if (i % 2 == 0){
                        System.out.println(i);
                    }
                }
            }finally {
                // 每个线程执行完都会减1
                latch.countDown();
            }
        }
    }
}

注:汇总类的业务中可能会用到

标签:JUC,闭锁,System,start,LatchDemo,CountDownLatch,latch,public
From: https://www.cnblogs.com/wzzzj/p/18045238

相关文章

  • JUC系列之(四)ConcurrentHashMap锁分段机制
    ConcurrentHashMap锁分段机制1.关于HashMap和HashTableHashMap:线程不安全HashTable:效率低:操作时锁整个表复合操作会带来安全问题//table.contains()和table.put()分别都是加了锁的,但是像下述复合操作,一个线程判断完之后CPU可能被其他线程抢夺,带来安全问题if(!table.c......
  • JUC系列之(三)原子变量
    原子变量-CAS算法1.i++的原子性问题i++的计算原理:读-改-写inttemp=i;i=i+1;将i++赋给其他变量的时候会将temp的值赋给其他变量,比如:inti=10;i=i++;//这里i的值就是10,i++的值实际上就是临时变量temp的值i++的原子性问题实例packagecom.atguigu.juc;......
  • JUC系列之(二)volatile关键字
    volatile关键字-内存可见性引出内存可见性问题的示例:packagecom.atguigu.juc;publicclassTestVolatile{publicstaticvoidmain(String[]args){//线程threadDemo修改共享变量的值ThreadDemothreadDemo=newThreadDemo();newThrea......
  • JUC并发编程与源码分析
    基础JUC是java.util.concurrent在并发编程中使用的工具包。线程的start()方法底层使用本地方法start0()调用C语言接口,再由C语言接口调用操作系统创建线程。publicclassdemo(){publicstaticvoidmain(Strings[]args){Threadt1=newThread(()->{System......
  • 【Java 并发】【十】【JUC数据结构】【十】PriorityBlockingQueue 原理
    1 前言这节我们继续看看另一个队列 PriorityBlockingQueue,优先级的哈。2 PriorityBlockingQueue介绍PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高或者最低的元素。其内部是使用平衡二叉树堆实现的,所以直接遍历队列元素不保证有序。默认使......
  • 【Java 并发】【十】【JUC数据结构】【九】ConcurrentLinkedQueue 原理
    1 前言JDK中提供了一系列场景的并发安全队列。总的来说,按照实现方式的不同可分为阻塞队列和非阻塞队列,前者使用锁实现,而后者则使用CAS非阻塞算法实现。这节我们来看看 ConcurrentLinkedQueue。2 ConcurrentLinkedQueue介绍ConcurrentLinkedQueue是线程安全的无界非阻......
  • 通信工具类countdownlatch和cyclicbarrier
    类作用semaphore限制线程数量exchanger两个线程交换数据countdownlatch递减屏障,线程等待直到计数器减为0时开始工作cyclicbarrier循环屏障,等屏障的线程数达到初始化值时,执行自定义的任务phaser增强的cyclicbarriercountdownlatch和cyclicbarrier区......
  • JUC【1.原子类、2.锁Lock、3.阻塞队列、4.并发集合容器、5.并发工具类、6.线程池】、
    (JUC简介)转自极客时间1.JUC简介从JDK1.5起,JavaAPI中提供了java.util.concurrent(简称JUC)包,在此包中定义了并发编程中很常用的工具,比如:线程池、阻塞队列、同步器、原子类等等。JUC是JSR166标准规范的一个实现,JSR166以及JUC包的作者是同一个人DougLea。2.原......
  • Java并发基础:CountDownLatch全面解析!
    内容概要CountDownLatch的优点在于能够简洁高效地协调多个线程的执行顺序,确保一组线程都完成后才触发其他线程的执行,适用于资源加载、任务初始化等场景。它提供了清晰的等待/通知机制,易于理解和使用,是提升多线程程序性能和可靠性的重要工具。核心概念CountDownLatch是java.util......
  • JUC并发编程 线程中断介绍及相关Api方法
    什么是中断机制首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了其次,在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供......