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日

相关文章

  • PHP细数实现提高并发能力的方法

    PHP细数实现提高并发能力的方法 1. 使用多线程 在PHP中,使用多线程技术可以有效提高并发能力。多线程技术可以将程序的运行分为多个部分同时执行,从而最大限度地利用CPU资源。 PHP原生虽然不支持多线程,但可以使用扩展库来实现。目前比较常见的扩展库有pthreads和pcntl。 以下是一个使用pthreads扩展库实现多线程的示例: <?php …

    多线程 2023年5月16日
    00
  • js基于setTimeout与setInterval实现多线程

    下面我就来详细讲解如何基于setTimeout和setInterval实现JavaScript的多线程编程。 什么是多线程? 在计算机科学中,一个进程可以包含多个线程,每个线程可以同时运行多个任务。多线程编程可以大大提高程序的并发性和处理能力,使程序能够更快地响应用户的操作和处理大规模数据。 在JavaScript中,由于其单线程的特点,会出现阻塞问题,如果…

    多线程 2023年5月16日
    00
  • python 协程并发数控制

    Python协程并发数控制攻略 在Python中,协程(coroutine)可以用于实现高效的异步编程,但是并发数控制也是一个很重要的问题。如果并发数过大,会导致系统的资源消耗过多,如果并发数过小,会影响程序执行的效率。怎么样控制协程的并发数呢?下面将为大家介绍Python中协程并发数控制的攻略: 1. 使用asyncio.Semaphore Python中…

    多线程 2023年5月16日
    00
  • Promise面试题详解之控制并发

    控制并发是 Promise 中比较重要、也比较常见的使用场景之一。 那么在面试中可能会有关于此方面的题目,下面我们来详细讲解一下控制并发的面试题攻略。 什么是并发控制? 并发控制指的是对于某些需要进行并发处理的操作,保证其并发数量的控制。 举个例子,假设我们现在需要爬取若干个网页,但是为了对目标网站造成压力使用单线程轮流爬取的策略并不可取,这时我们就可以用 …

    多线程 2023年5月16日
    00
  • C#使用队列(Queue)解决简单的并发问题

    C#使用队列(Queue)解决简单的并发问题 在多线程编程的过程中,常常遇到需要处理多个任务的情况,此时就需要使用队列(Queue)来协调多个线程之间的任务执行。下面是使用C#语言来实现这种并发处理的完整攻略。 概述 队列(Queue)是一个先进先出(FIFO)的数据结构,可以实现多个线程之间的任务分配和处理。在使用队列时,一个线程将任务放入队列,而另一个线…

    多线程 2023年5月16日
    00
  • C#集合之并发集合的用法

    C#集合之并发集合的用法 什么是并发集合 并发集合是一组C#中线程安全的集合类型,允许多个线程同时对一个集合进行读写操作,而不需要进行额外的同步处理。在多线程的场景下,使用并发集合可以提高代码的并发性能,避免多线程访问同一个集合时可能出现的线程安全问题。 .NET Framework提供了多种并发集合类型,包括ConcurrentDictionary、Con…

    多线程 2023年5月16日
    00
  • Java 多线程同步 锁机制与synchronized深入解析

    Java 多线程同步 锁机制与synchronized深入解析 在Java多线程编程中,为了保证线程安全,我们需要使用同步机制来避免多个线程同时访问共享资源造成数据不一致等问题。其中最常用的同步机制就是锁机制。 锁机制 锁机制就是控制多个线程访问共享资源的方式,一般来说,对于共享资源的访问,我们需要通过获取锁来限制只有一个线程可以访问,其他线程需要等待当前线…

    多线程 2023年5月16日
    00
  • Java基础:彻底搞懂java多线程

    Java基础:彻底搞懂Java多线程 前言 多线程作为Java重要的特性,其重要性不言而喻。本文将从以下几个方面系统讲解Java多线程的知识,包括: 什么是多线程 线程的状态 创建线程的方式 线程池 线程同步与锁 并发编程相关类 示例 什么是多线程 多线程即在一个程序中同时运行多个线程,这些线程可以并发执行。在Java中,用Thread类、Runnable接…

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