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日

相关文章

  • Linux中多线程详解及简单实例

    Linux中多线程详解及简单实例 简介 在Linux系统下,多线程是一种常见的编程方法,能够有效提高程序的运行效率。本篇文章将从多线程的概念、使用方法以及简单实例展开讨论。 多线程概念 多线程是指在一个进程(process)内部,存在多个独立运行的线程(thread),每个线程都有自己的执行序列和程序计数器。多线程可以利用多核CPU并行处理任务,提高程序的运…

    多线程 2023年5月17日
    00
  • .NET Windows 多线程thread编程

    针对“.NET Windows 多线程thread编程”,我可以为您提供以下完整攻略: 理解多线程Thread 多线程指的是在同一个进程中,同时存在多个线程(Thread),每个线程去执行一段独立的代码,从而实现多任务并发执行的效果。在Windows应用程序中,多线程编程相对于单线程编程,可以提高应用程序的性能和响应速度,尤其在一些对时间有较高要求的应用中,…

    多线程 2023年5月17日
    00
  • c#使用多线程的几种方式示例详解

    Markdown格式文本是一种轻量级的标记语言,可以方便地对文本进行排版和格式化,使得文本更具可读性和可维护性。在本文中,我们将详细介绍如何使用Markdown格式文本编写“C#使用多线程的几种方式示例详解”的完整攻略,包含至少两条示例说明。 C#使用多线程的几种方式示例详解 概述 多线程是一种并发执行模型,可以提高程序性能和响应速度。C#是一种支持多线程编…

    多线程 2023年5月17日
    00
  • Yii+MYSQL锁表防止并发情况下重复数据的方法

    在 Yii 中,我们可以使用 MYSQL 锁表的方式来防止并发情况下重复数据的产生。下面是完整攻略的步骤: 步骤一:准备工作 在开始之前,确保已经完成了以下准备工作: 已经安装好了 Yii 框架以及 MYSQL 数据库 有相应的表格需要进行锁定 步骤二:检查并发情况下的数据重复 在进行 MYSQL 锁表之前,必须先检查并发情况下的数据重复。可以通过以下方法实…

    多线程 2023年5月17日
    00
  • PHP 异步执行方法,模拟多线程的应用分析

    下面是关于“PHP 异步执行方法,模拟多线程的应用分析”的完整攻略: 什么是PHP异步执行? 在PHP脚本执行时,通常是按照顺序执行的,即一行一行顺序执行。这就意味着,在执行一个比较耗时的操作时,脚本会被阻塞,等待操作完成之后再继续执行下一行代码。这种方式叫做同步执行。 异步执行就是一种不阻塞当前线程的执行方式,在操作耗时完成之前,程序能够继续执行下一行代码…

    多线程 2023年5月17日
    00
  • java web如何解决瞬间高并发

    Java Web如何解决瞬间高并发一直是Java开发者们所关心的一个话题。下面我将详细讲解Java Web如何解决瞬间高并发的完整攻略,包括以下步骤: 使用负载均衡器 使用缓存技术 使用异步处理 优化数据库 垂直扩展和水平扩展 一、使用负载均衡器 负载均衡器(Load Balancer)是一种将网络流量平衡分发到多台服务器上的设备。使用负载均衡器能够有效降低…

    多线程 2023年5月16日
    00
  • Linux之线程的创建方式

    下面详细讲解Linux线程的创建方式。 创建线程的方式 在Linux中,我们可以通过pthread库来创建线程,其中比较常用的三种方式分别是: 使用pthread_create函数来创建线程。 使用fork函数创建进程,然后使用pthread_create函数在新进程中创建线程。 使用clone系统调用来创建线程。 下面分别对这三种方式进行详细说明。 使用p…

    多线程 2023年5月16日
    00
  • Java多线程中Lock锁的使用总结

    Java多线程中Lock锁的使用总结 什么是Lock? 在Java中,Lock是一种比synchronized更加灵活、功能更加强大的线程同步机制。它可以提供比传统的synchronized更为广泛的锁定操作。 Lock和synchronized的对比 锁的获取方式 synchronized是隐式获取锁,只要进入synchronized保护的代码段,锁就会自…

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