浅谈java并发之计数器CountDownLatch

浅谈 Java 并发之计数器 CountDownLatch

概述

在 Java 并发编程中,CountDownLatch 是一个常用的同步工具类,可以用于控制多个线程的执行顺序,也可以用于实现线程的等待。

CountDownLatch 底层是基于 AQS(AbstractQueuedSynchronizer)实现的同步器,它的主要思想是让等待线程休眠,直到计数器计数为 0 开始执行。

使用方法

CountDownLatch 类提供了两个核心方法:countDown()await()

  • public void countDown()

countDown() 方法让计数器减 1,当计数器减到 0 时,所有等待中的线程被唤醒。

```java
CountDownLatch countDownLatch = new CountDownLatch(2);

Thread thread1 = new Thread(() -> {
// do something
countDownLatch.countDown();
});

Thread thread2 = new Thread(() -> {
// do something
countDownLatch.countDown();
});

thread1.start();
thread2.start();

countDownLatch.await();
System.out.println("All threads have done their job.");
```

  • public void await() throws InterruptedException

await() 方法是一个阻塞方法,让当前线程等待,直到计数器归零。

```java
CountDownLatch countDownLatch = new CountDownLatch(1);

Thread thread = new Thread(() -> {
// do something
countDownLatch.countDown();
});

thread.start();

countDownLatch.await();
System.out.println("Thread has done its job.");
```

示例说明

示例一

假设有两个线程 A 和 B,线程 A 执行完后需要等待线程 B 执行完成之后才能继续执行。

public class CountDownLatchExample1 {

    private static CountDownLatch countDownLatch = new CountDownLatch(1);

    public static void main(String[] args) throws InterruptedException {
        Thread threadA = new Thread(() -> {
            // do something
            System.out.println("Thread A has done its job.");
            countDownLatch.countDown();
        });

        Thread threadB = new Thread(() -> {
            // do something
            System.out.println("Thread B has done its job.");
        });

        threadA.start();
        threadB.start();

        // 线程 A 等待线程 B 执行完
        countDownLatch.await();

        System.out.println("All threads have done their job.");
    }
}

输出结果:

Thread A has done its job.
Thread B has done its job.
All threads have done their job.

示例二

假设有三个线程 A、B 和 C,线程 A 和线程 B 同时开始执行,当它们都执行完成之后,线程 C 才能执行。

public class CountDownLatchExample2 {

    private static CountDownLatch countDownLatch = new CountDownLatch(2);

    public static void main(String[] args) throws InterruptedException {
        Thread threadA = new Thread(() -> {
            // do something
            System.out.println("Thread A has done its job.");
            countDownLatch.countDown();
        });

        Thread threadB = new Thread(() -> {
            // do something
            System.out.println("Thread B has done its job.");
            countDownLatch.countDown();
        });

        Thread threadC = new Thread(() -> {
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // do something
            System.out.println("Thread C has done its job.");
        });

        threadA.start();
        threadB.start();
        threadC.start();

        System.out.println("All threads have started.");
    }
}

输出结果:

All threads have started.
Thread A has done its job.
Thread B has done its job.
Thread C has done its job.

注意事项

  • CountDownLatch 的计数器一旦减到 0,就不能再被重置,因此 CountDownLatch 是一次性的,不能重复使用,需要重新创建。
  • 当线程在 await() 方法处等待时,可以中止等待,即中断当前线程,抛出 InterruptedException 异常。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈java并发之计数器CountDownLatch - Python技术站

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

相关文章

  • Java多线程中断机制三种方法及示例

    先给大家介绍一下这篇攻略的目录: 目录 Java多线程中断机制简介 interrupt()方法 示例1:线程在睡眠时被中断 示例2:线程使用while循环时被中断 isInterrupted()方法 示例3:判断是否被中断 interrupted()方法 示例4:判断是否被中断并清除中断标志位 现在我们来一步步讲解每个部分的内容。 Java多线程中断机制简介…

    多线程 2023年5月17日
    00
  • Java编程之多线程死锁与线程间通信简单实现代码

    让我们来详细讲解一下“Java编程之多线程死锁与线程间通信简单实现代码”的完整攻略。 什么是多线程死锁? 在多线程编程中,死锁是指两个或多个线程互相等待对方释放锁,从而陷入无限循环的一种状态。这种状态下程序无法继续执行,需要手动中断才能结束。 如何避免多线程死锁? 避免线程间相互等待对方释放锁,即避免多个线程同时持有锁。 确保每个线程只获取自己需要的锁,并在…

    多线程 2023年5月16日
    00
  • Redis并发访问问题详细讲解

    下面是Redis并发访问问题详细讲解的完整攻略: Redis并发访问问题详细讲解 什么是Redis并发访问 在多线程或多进程的情况下,多个线程或进程会同时访问Redis服务,这时就可能会出现并发访问的问题。Redis并发访问是指多个并发请求访问同一个Redis实例导致的数据一致性问题。 Redis并发访问的问题及解决方案 Redis并发访问可能会导致以下问题…

    多线程 2023年5月16日
    00
  • 基于java 线程的几种状态(详解)

    基于 Java 线程的几种状态(详解) 在 Java 语言中,线程是一种非常重要的概念。线程可以被分为多个状态,在不同的状态下,线程的行为和特征是不同的。本文将详细介绍基于 Java 线程的几种状态,并通过两个示例来演示它们。 线程的状态 在 Java 中,线程有以下几种状态: 新建状态(New):线程尚未启动,处于新建状态。 运行状态(Running):线…

    多线程 2023年5月17日
    00
  • Redis高并发情况下并发扣减库存项目实战

    Redis高并发情况下并发扣减库存项目实战 项目背景 很多电商平台在购物高峰期会面临商品库存不足的问题,而库存紧张问题不但要求电商平台提高库存的数量,也要求电商平台优化库存的流程,实现高效扣减库存。 本项目利用Redis实现库存扣减,具体做法是:每次库存变动可以作为一个事务放到Redis的事务队列中,通过WATCH命令加锁机制,避免并发扣减库存冲突。 项目实…

    多线程 2023年5月16日
    00
  • C#中的多线程多参数传递详解

    我们来详细讲解C#中的多线程多参数传递问题。 一、使用委托来传递多个参数 在C#中,我们可以使用委托来传递多个参数。具体步骤如下: 定义委托类型,包含所有需要传递的参数 public delegate void MyDelegate(string str1, int num1); 定义主函数,作为委托的执行体 public static void MyFun…

    多线程 2023年5月17日
    00
  • Java httpClient连接池支持多线程高并发的实现

    Java httpClient是一种开源的基于Http的请求和响应类型,它可以通过连接池技术适用于高并发的请求场景,下面是httpClient连接池支持多线程高并发的实现攻略: 1. 引入依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <art…

    多线程 2023年5月16日
    00
  • Python基于gevent实现高并发代码实例

    Python基于gevent实现高并发代码实例 1. 前言 在网络编程中,我们经常会遇到高并发的情形,即有大量的请求同时涌向服务器,需要服务器能够快速响应并处理这些请求。在 Python 中,我们可以使用多线程或多进程等方式来实现高并发,但是这些方式在一定程度上会影响程序的性能。 这时,使用协程来实现高并发就是一个好的方案。Python 中有很多支持协程的第…

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