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经常被用于复杂的多线程应用程序中,可以提高代码的可读性和可维护性。

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

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

相关文章

  • Java多线程编程中的并发安全问题及解决方法

    Java多线程编程中的并发安全问题及解决方法 1. 并发安全问题 Java多线程编程在实现高并发、高性能的同时,也带来了一些潜在的并发安全问题,如: 线程间数据竞争 线程间操作顺序问题 线程安全性问题 接下来,我们详细讲解这些问题。 1.1 线程间数据竞争 当多个线程同时对一个共享的变量进行读写时,会出现线程间数据竞争问题。因为操作系统的线程调度是不可控的,…

    多线程 2023年5月16日
    00
  • java多线程join()方法的作用和实现原理解析(应用场景)

    java多线程join()方法的作用和实现原理解析 作用 在Java多线程编程中,有时候需要等待一个线程完成后再去执行其他任务。这时候就需要用到join()方法。join()方法会阻塞当前线程,等待被调用线程执行完成后再继续执行。 实现原理 当调用join()方法时,调用线程会进入等待状态,等待被调用线程执行完成。在Thread的join()方法内部,会调用…

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

    Java面试题冲刺第二十五天–并发编程3主要包含了以下知识点: 并发中的线程调度机制 Java中多线程编程的5种状态,如何通过编码实现状态间的转换 Java中如何使用wait()、notify()和notifyAll()方法控制线程等待和唤醒 Java中如何使用Lock、Condition和ReentrantLock实现线程同步 以下是对这些知识点的详细讲…

    多线程 2023年5月17日
    00
  • Python多线程threading和multiprocessing模块实例解析

    Python 多线程和多进程模块实例解析 概述 Python 是一种解释型语言,它天然支持多线程和多进程。 在 Python 中,多线程和多进程是通过 threading 和 multiprocessing 两个模块来实现的。这两种技术可以帮助我们实现并发编程,提高代码的执行效率。 Python threading 模块 threading 模块提供了一种在…

    多线程 2023年5月17日
    00
  • Java多线程实现异步调用的方法

    下面我将为您详细讲解Java多线程实现异步调用的方法,攻略如下: 什么是异步调用 异步调用指的是在进行某些操作时,对于一些需要等待的操作,我们不必阻塞主线程一直等待其完成,而是在另外一个线程中完成操作,并通过回调函数等方式通知主线程执行结果。 Java多线程实现异步调用的方法 Java多线程实现异步调用有多种方法,下面介绍两种比较常用的方法: 1. 使用Ex…

    多线程 2023年5月17日
    00
  • 详解JUC并发编程中的进程与线程学习

    详解JUC并发编程中的进程与线程学习攻略 一、进程与线程的概念及区别 进程:是指正在执行的程序的实例。每个进程都有独立的内存空间,它可以包括多个线程。 线程:是指程序中独立、并发执行的最小单位,它直接依赖于进程,一个进程可以创建多个线程。 进程与线程的最大区别在于进程是资源分配的最小单位,线程是CPU调度的最小单位。线程共享进程的内存空间以及其他系统资源。 …

    多线程 2023年5月16日
    00
  • Java并发系列之CyclicBarrier源码分析

    首先我要解释一下什么是CyclicBarrier。CyclicBarrier是一种在多线程中实现控制并发的同步工具,也可以看作是一种倒计数器。它的作用是允许一组线程在某个时刻全部到达一个屏障点,然后它们可以相互等待,直到所有的线程都到达这个屏障点后一起继续执行。我们可以使用Java的CyclicBarrier类来实现这个功能。 下面是这个攻略的详细步骤: 一…

    多线程 2023年5月16日
    00
  • 浅谈java并发之计数器CountDownLatch

    浅谈 Java 并发之计数器 CountDownLatch 概述 在 Java 并发编程中,CountDownLatch 是一个常用的同步工具类,可以用于控制多个线程的执行顺序,也可以用于实现线程的等待。 CountDownLatch 底层是基于 AQS(AbstractQueuedSynchronizer)实现的同步器,它的主要思想是让等待线程休眠,直到计…

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