Java线程并发工具类CountDownLatch原理及用法

Java线程并发工具类CountDownLatch原理及用法

简介

CountDownLatch是一种非常实用的java线程同步工具类,主要作用是允许一个或多个线程一直等待,在其他线程执行完一组操作之后才执行。

CountDownLatch主要有两个方法:
* countDown() : 对计数器进行操作,将计数器的值减少1
* await() : 调用该方法的线程等待计数器为0,也就是其他线程执行完毕后再执行

原理

CountDownLatch原理主要基于AQS(AbstractQueuedSynchronizer)的共享模式和共享锁实现。

当main线程调用CountDownLatch的await方法时,如果计数器不为0,则main线程会进入等待状态,同时计数器对应的线程会继续执行;当计数器减少到0时,main线程便会被唤醒,继续执行后面的代码。

用法

场景1:实现多个线程并发执行

当需要多个线程并发执行任务,需要在一定条件下一起执行,可以使用CountDownLatch实现。

示例代码:

public class CountDownLatchTest {

    private static final int THREAD_COUNT = 5;

    private static final CountDownLatch COUNT_DOWN_LATCH = new CountDownLatch(THREAD_COUNT);

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < THREAD_COUNT; i++) {
            Thread thread = new Thread(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "执行完毕!");
                COUNT_DOWN_LATCH.countDown();
            });
            thread.start();
        }

        COUNT_DOWN_LATCH.await();
        System.out.println("所有线程执行完毕!");
    }
}

在上述代码中,首先定义了一个COUNT_DOWN_LATCH的CountDownLatch对象,并初始化计数器为THREAD_COUNT=5;然后启动了5个线程,每个线程执行完成后都会调用COUNT_DOWN_LATCH对象的countDown方法对计数器进行减一操作;main线程通过调用COUNT_DOWN_LATCH.await()方法来等待所有线程执行完毕,这样就可以保证所有线程都执行完毕后再执行后续的代码。

场景2:实现主线程等待子线程完成任务

当主线程需要等待子线程完成任务后再执行时,可以使用CountDownLatch来实现。

示例代码:

public class CountDownLatchTest {

    private static final CountDownLatch COUNT_DOWN_LATCH = new CountDownLatch(1);

    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "开始执行任务...");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "执行任务完成!");
            COUNT_DOWN_LATCH.countDown();
        });
        thread.start();

        System.out.println(Thread.currentThread().getName() + "等待子线程执行任务...");
        try {
            COUNT_DOWN_LATCH.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("所有任务完成,主线程开始执行!");
    }
}

在上述代码中,首先定义一个COUNT_DOWN_LATCH的CountDownLatch对象,并初始化计数器为1;然后启动了一个线程thread,该线程执行完成后会调用COUNT_DOWN_LATCH对象的countDown方法对计数器进行减一操作;主线程通过调用COUNT_DOWN_LATCH.await()方法来等待子线程执行完毕,这样就可以保证主线程在子线程执行完毕后再执行后续的代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程并发工具类CountDownLatch原理及用法 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Redis处理高并发机制原理及实例解析

    Redis处理高并发机制原理及实例解析 简介 Redis是一种高性能的NoSQL存储,拥有高并发、高可用、高性能等特点。在现代web应用中,Redis已经成为了必不可少的组件之一。本文将详细介绍Redis处理高并发的机制原理,并结合实例进行说明。 Redis处理高并发的机制原理 Redis处理高并发的机制主要依靠以下两个方面: 基于单线程模型的高效执行 多种…

    多线程 2023年5月16日
    00
  • Java Socket编程(四) 重复和并发服务器

    Java Socket编程是网络编程的主流实现方式之一,同时也是Java程序员不容忽视的一项技能。本文将介绍如何实现一个可以处理并发Socket请求的服务器,具体内容如下: 一、问题背景 在暴力测试Socket服务器时,会发现一些问题:如果有多个客户端尝试连接到同一个服务器,服务器就会拒绝连接。例如,在执行以下代码时: Socket socket1 = ne…

    多线程 2023年5月16日
    00
  • Java面试题冲刺第二十五天–并发编程2

    下面我将详细讲解“Java面试题冲刺第二十五天–并发编程2”的完整攻略。 标题 Java面试题冲刺第二十五天–并发编程2 内容 介绍 本次攻略主要是针对Java并发编程中的一些问题进行剖析和解决,主要涉及到以下几个方面: 线程池的使用 死锁的排查和解决 并发编程的常见问题和解决方法 线程池的使用 线程池是Java并发编程中非常重要的概念,通过线程池,我们…

    多线程 2023年5月17日
    00
  • 浅谈java线程状态与线程安全解析

    浅谈Java线程状态与线程安全解析 线程状态 Java 中的线程一共有 6 个状态: New:新建状态,线程刚被创建后的状态。 Runnable:就绪状态,表示线程已经创建好了,等 JVM 分配 CPU 时间片来运行。 Blocked:阻塞状态,在以下情况下会进入阻塞状态: 线程调用 sleep() 方法,线程进入定时等待。 线程获取 synchronize…

    多线程 2023年5月17日
    00
  • Java面试题冲刺第十二天–数据库(2)

    来给大家详细讲解一下“Java面试题冲刺第十二天–数据库(2)”的完整攻略。 一、数据库相关知识点 本篇文章主要涉及以下数据库相关知识点: 数据库事务 数据库锁 事务的隔离级别 数据库优化 二、数据库事务 数据库事务可以保证多个对数据库的操作是一个原子性操作,即只要其中有一个操作失败,整个事务都将回滚。 在Java中使用JDBC进行事务控制时,需要使用以下…

    多线程 2023年5月17日
    00
  • Java多线程导致CPU占用100%解决及线程池正确关闭方式

    Java多线程是一种强大的工具,在程序执行效率方面可以发挥非常大的作用,但如果不注意编程规范或不恰当地使用多线程的话,可能会出现CPU占用率过高的问题。本文将介绍如何解决因Java多线程导致CPU占用率过高的问题,并附带两条示例说明。 问题背景 Java通过JUC(Java Util Concurrent)提供了许多多线程编程的工具,使得Java 开发人员可…

    多线程 2023年5月17日
    00
  • java并发分段锁实践代码

    Java并发分段锁(Segment Lock)是一种优化并发性能的技术,它将一个大的锁分成若干小的锁,让多个线程可以同时访问不同的小锁,减少锁的争用,提高系统并发性能。下面我们来讲解如何实现Java的分段锁。 实现分段锁的步骤 创建一个Segment数组。Segment数组是一个包含很多Segment元素的数组,每个Segment元素具有独立的锁。 获取要操…

    多线程 2023年5月17日
    00
  • 详解Java七大阻塞队列之SynchronousQueue

    详解Java七大阻塞队列之SynchronousQueue 简介 Java提供了七种不同类型的阻塞队列,SynchronousQueue是其中比较特殊的一种。它的特点是在插入元素时必须等待另外一个线程同时要移除这个元素,否则阻塞当前线程;同理,在移除元素时也必须等待另一个线程同时要插入这个元素,否则也会阻塞当前线程。这使得SynchronousQueue成为…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部