Java多线程之同步工具类CountDownLatch

当我们在开发多线程应用程序时,经常需要在等待某一些任务完成后再继续执行下去。Java中提供了多种同步工具类,包括CountDownLatch。

CountDownLatch是一个同步工具类,用于等待一个或多个线程执行完毕后再执行另一个或多个线程。CountDownLatch通过计数器来实现,计数器初始化为一个整数,当计数器为0时,另一个线程可以执行。

以下是使用CountDownLatch的示例:

示例1:一组线程等待某个线程完成后再继续执行

public class Main {
  public static void main(String[] args) throws InterruptedException {
    CountDownLatch countDownLatch = new CountDownLatch(1);

    Thread thread1 = new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("Thread1 is running");
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println("Thread1 is done");
        countDownLatch.countDown();
      }
    });

    Thread thread2 = new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("Thread2 is waiting for Thread1 to finish");
        try {
          countDownLatch.await();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println("Thread2 is running");
      }
    });

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

    thread1.join();
    thread2.join();
  }
}

在这个例子中,我们使用了CountDownLatch来使线程2等待线程1结束后再执行。当线程1开始运行时,它打印“Thread1 is running”,睡眠2秒钟后再打印“Thread1 is done”,然后减少CountDownLatch的计数器。线程2等待CountDownLatch的计数器为0,一旦它变为0,线程2就开始运行,并打印“Thread2 is running”。

示例2:一组线程等待所有线程完成后再继续执行

public class Main {
  public static void main(String[] args) throws InterruptedException {
    CountDownLatch countDownLatch = new CountDownLatch(3);

    Thread thread1 = new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("Thread1 is running");
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println("Thread1 is done");
        countDownLatch.countDown();
      }
    });

    Thread thread2 = new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("Thread2 is running");
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println("Thread2 is done");
        countDownLatch.countDown();
      }
    });

    Thread thread3 = new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("Thread3 is running");
        try {
          Thread.sleep(3000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println("Thread3 is done");
        countDownLatch.countDown();
      }
    });

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

    countDownLatch.await();

    System.out.println("All threads are done");
  }
}

在这个例子中,我们使用了CountDownLatch来使线程等待多个其他线程全部完成后再执行。我们初始化了CountDownLatch的计数器为3,也就是说有3个线程需要等待。每个线程在完成任务后都会把CountDownLatch的计数器减1。主线程在调用await方法后会一直等待,直到计数器变为0。当计数器变为0时,主线程就会继续执行,并打印“All threads are done”。

总结
CountDownLatch是一个非常方便的同步工具,可以帮助我们等待一个或多个线程完成后再继续执行。在上面的示例中,我们演示了如何使用CountDownLatch在一组线程中等待某个线程完成后再继续执行,以及如何等待多个线程全部完成后再继续执行。在实际开发中,CountDownLatch经常被用于复杂的多线程应用程序中,可以提高代码的可读性和可维护性。

阅读剩余 59%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程之同步工具类CountDownLatch - Python技术站

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

相关文章

  • Java中多线程的ABA场景问题分析

    Java中多线程的ABA场景问题分析 ABA场景问题简介 多线程中,如果一个线程在读取一个共享变量时,另一个线程把它修改为另外一个值,再修改回原来的值,这时第一个线程可能会检查到期望的值,但是并没有发现这个值已经被修改过,这种情况就叫做ABA场景问题。 ABA场景问题如何解决 Java中提供了一个原子变量类AtomicStampedReference来解决A…

    多线程 2023年5月16日
    00
  • 基于线程、并发的基本概念(详解)

    基于线程、并发的基本概念(详解) 什么是线程和并发? 线程 线程是程序执行的一条路径,每个线程都是独立的,具有自己的栈空间和程序计数器。同一个程序中如果有多个线程,它们可以并发执行,即同时执行,换句话说,多线程可以用来实现程序的并发性。 并发 并发,指的是系统能够同时处理多个任务的能力。例如,多个线程在同时执行不同的任务,或者同一个线程在同时执行多个任务,都…

    多线程 2023年5月17日
    00
  • Java多线程之锁学习(增强版)

    Java多线程之锁学习(增强版)攻略 什么是锁? 锁是一种同步机制,用于协调对共享资源的访问。在Java中,可以使用synchronized关键字或Lock接口来实现锁。 synchronized锁 synchronized关键字可以修饰方法和代码块。当多个线程访问被synchronized修饰的方法或代码块时,只有一个线程可以执行,其他线程需要等待。 修饰…

    多线程 2023年5月16日
    00
  • IOS 创建并发线程的实例详解

    IOS 创建并发线程的实例详解 在 iOS 中,我们可以利用 Grand Central Dispatch(GCD) 来方便地创建并发线程。本篇攻略将给出具体的创建并发线程的方法和相关代码示例。 GCD 简介 Grand Central Dispatch(GCD) 是苹果公司推出的一种多核编程的解决方案,在 MacOSX10.6 后首次被引入,以取代原先的 …

    多线程 2023年5月16日
    00
  • Java创建并运行线程的方法

    Java创建并运行线程的方法 在Java中,线程是一个非常重要的概念。线程可以让我们以一种非阻塞的方式来处理并发性问题,这使得Java变得非常适合于开发高性能、高并发的应用程序。本文将详细介绍Java创建并运行线程的方法。 Java创建线程的方法 在Java中,有两种方法来创建线程:继承Thread类,或者实现Runnable接口。以下是两种方法的示例代码:…

    多线程 2023年5月16日
    00
  • Python中的并发编程实例

    关于Python中的并发编程实例,可以分为如下步骤进行: 步骤一:什么是并发编程? 并发编程简单来说就是在同一时间内处理多个任务,让程序更加高效、快速的运行。Python中有多种并发编程解决方案,例如线程、协程、多进程等。 步骤二:Python中的常用并发编程模块 Python语言自带的标准库中已经提供了一些常见的并发编程模块,例如threading、mul…

    多线程 2023年5月16日
    00
  • 详解C++ 共享数据保护机制

    详解C++ 共享数据保护机制攻略 什么是共享数据 共享数据是指多个线程同时访问同一数据,而且每个线程都可以修改数据。因为多个线程同时访问同一数据,所以需要额外的保护机制来避免数据竞争和错误的结果。 数据保护机制 常见的数据保护机制有: 1. 互斥锁(Mutex) 互斥锁是一种最常用的保护共享数据的方法,即通过加锁(lock)来保护共享数据。同一时间只有一个线…

    多线程 2023年5月17日
    00
  • 区块链智能合约中的并发性和并行性

    区块链智能合约是一个基于区块链技术的智能合约系统,在合同的实现中可以体现很强的并发性和并行性。下面将从并发性和并行性两个方面对其进行讲解。 并发性 并发性指的是在合约权限不冲突的情况下,多个交易可以同时得到确认和执行。由于一个区块链网络要处理很多交易,因此并发性对于保证系统的快速性和稳定性具有重要意义。 在区块链智能合约中,通过智能合约的定义和资源的强制限制…

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