如何使用CountDownLatch同步java多线程

使用CountDownLatch同步Java多线程的完整攻略包括以下步骤:

什么是CountDownLatch

CountDownLatch是Java中的一个并发工具类,可以用于对多个线程之间的并发操作进行同步。当我们创建一个CountDownLatch对象,并指定一个计数器的值时,多个线程可以同时启动并执行任务,但是只有当计数器为0时,线程才能继续执行。

CountDownLatch的实现

CountDownLatch由一个计数器和两个方法组成:countDown和await。计数器初始值为我们指定的数量,每次调用countDown方法时,计数器的值减1。当计数器值为0时,await方法返回。

使用示例1:计算线程

下面是一个在多个线程中执行计算的示例,使用CountDownLatch实现同步。

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchExample1 {

    public static void main(String[] args) {

        int nThreads = 5;

        CountDownLatch latch = new CountDownLatch(nThreads);

        ExecutorService executor = Executors.newFixedThreadPool(nThreads);

        for (int i = 0; i < nThreads; i++) {
            executor.execute(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + " is working...");
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    latch.countDown();
                }
            });
        }

        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

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

这段代码中,我们创建了5个线程,同时我们创建了一个CountDownLatch,指定了计数器的初始值为5。我们使用ExecutorService来启动线程,每个线程执行完毕后,都会调用CountDownLatch的countDown方法。在主线程中我们调用了await方法,使主线程等待所有的线程都执行完毕。当计数器的值减到0时,await方法返回,主线程继续执行。

使用示例2:并发HTTP请求

下面是一个在多个线程中执行HTTP请求的示例,使用CountDownLatch实现同步。

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchExample2 {

    private static final int N_THREADS = 5;

    public static void main(String[] args) {

        CountDownLatch latch = new CountDownLatch(N_THREADS);

        ExecutorService executor = Executors.newFixedThreadPool(N_THREADS);

        for (int i = 0; i < N_THREADS; i++) {
            executor.execute(() -> {
                try {
                    HttpURLConnection connection = (HttpURLConnection) new URL("http://www.baidu.com").openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(5000);
                    connection.setReadTimeout(5000);
                    connection.connect();
                    System.out.println(Thread.currentThread().getName() + " is finished. Response code: " + connection.getResponseCode());
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    latch.countDown();
                }
            });
        }

        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("All requests are finished.");
    }
}

这段代码中,我们创建了一个CountDownLatch,指定了计数器的初始值为5,这个值与我们创建的线程数量相同。我们使用ExecutorService来启动线程,每个线程执行完毕后,都会调用CountDownLatch的countDown方法。在主线程中我们调用了await方法,使主线程等待所有的线程都执行完毕。当计数器的值减到0时,await方法返回,主线程继续执行。

结论

CountDownLatch是Java中非常有用的一个并发工具类,可以用于对多个线程之间的并发操作进行同步。使用CountDownLatch可以方便地实现多线程等待和同步操作,避免了使用wait和notify等低级别的线程同步方法带来的风险和不便。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何使用CountDownLatch同步java多线程 - Python技术站

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

相关文章

  • C/C++中线程基本概念与创建详解

    C/C++中线程基本概念与创建详解 什么是线程? 线程是进程中的一个执行单元,一个进程可以有多个线程,各个线程可以并行执行不同的任务,彼此之间相对独立。线程共享进程的地址空间,可以方便地相互通信。 线程的创建 在C/C++语言中,可以通过调用系统提供的API函数来创建线程。常见的API函数有: CreateThread():Windows系统下的线程创建AP…

    多线程 2023年5月17日
    00
  • C++基于消息队列的多线程实现示例代码

    消息队列 消息队列是一种进程间通信的方式,用于不同进程之间的异步通信。消息队列允许发送者将消息存储在队列中,接收者可以在任何时间从队列中获取这些消息。这种通信方式可以提高系统的效率和可拓展性,因为它允许多个线程或进程同时处理消息。 C++基于消息队列的多线程实现示例代码 本文中我们将使用msgpack消息序列化/反序列化库和threadpool线程池库来实现…

    多线程 2023年5月17日
    00
  • RocketMQ Broker实现高可用高并发的消息中转服务

    这里是 RocketMQ Broker 实现高可用高并发的消息中转服务的完整攻略: 1. 背景 RocketMQ 是阿里巴巴开源的分布式消息系统,目前在行业内使用非常广泛。在一个企业级应用程序中,系统的高可用性是至关重要的,这意味着您必须确保当出现硬件或软件故障时,系统将不会完全停止。为了实现高可用性,我们需要在消息中间件中引入 Broker 集群。 Roc…

    多线程 2023年5月17日
    00
  • Java多线程实现同时输出

    要让Java多线程实现同时输出,可以采用以下方法: 1.使用线程同步 线程同步可以保证多个线程在执行相同代码段时的互斥。在Java中,可以使用synchronized关键字实现线程同步。下面是一个简单的示例: public class Main { public synchronized void printNumbers(int n) { for (int…

    多线程 2023年5月17日
    00
  • 使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)

    使用pthreads扩展可以在PHP中实现真正的多线程执行,从而可以提高PHP代码的并发性和性能。下面是使用pthreads实现PHP多线程的完整攻略: 安装pthreads扩展:在PHP 5.3以上版本中,pthreads扩展已经被内置,但默认是未启用状态,需要在编译安装PHP时增加启用选项,或在运行时使用dl()函数来动态加载扩展。如果使用的是PHP 7…

    多线程 2023年5月17日
    00
  • 5个并发处理技巧代码示例

    下面我来详细讲解一下“5个并发处理技巧代码示例”的完整攻略。 1. 使用锁机制 在并发处理时,如果多个线程同时访问同一份数据,就会发生数据竞争的问题。为了避免这种问题,可以使用锁机制来实现线程的同步。 例如,下面这段代码展示了如何使用sync.Mutex锁来保证线程安全: import ( "fmt" "sync" )…

    多线程 2023年5月16日
    00
  • 彻底搞懂Java多线程(一)

    彻底搞懂Java多线程(一) 为什么需要多线程 在Java应用程序中,多线程可以帮助我们利用CPU资源,提高程序的执行效率,加速程序的运行速度。理论上,一个程序的执行速度可以比单线程的程序快1到100倍不等。 Java多线程的实现方式 Java多线程的实现方式主要有两种:继承Thread类和实现Runnable接口。 继承Thread类 使用继承Thread…

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

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

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