Java多线程结合CountDownLatch实现

1. 流程概述

为了帮助小白实现Java多线程结合CountDownLatch,以下是整个实现的流程:

步骤 描述
1 创建一个CountDownLatch对象,并设置计数器的初始值为需要等待的线程数
2 创建多个线程,并将CountDownLatch对象传递给每个线程
3 在每个线程中执行需要等待的操作,操作完成后调用CountDownLatch的countDown()方法,将计数器减1
4 主线程调用CountDownLatch的await()方法,等待计数器为0
5 当计数器为0时,表示所有线程都执行完毕,主线程可以继续执行其他操作

接下来,我会逐步解释每个步骤需要做什么,并提供相应的代码示例。

2. 代码示例

步骤1:创建CountDownLatch对象

首先,我们需要在主线程中创建一个CountDownLatch对象,并设置计数器的初始值为需要等待的线程数。在本例中,我们设置计数器的初始值为3。

CountDownLatch latch = new CountDownLatch(3);

步骤2:创建多个线程

接下来,我们需要创建多个线程,并将CountDownLatch对象传递给每个线程。在本例中,我们创建了3个线程。

Thread thread1 = new Thread(new MyRunnable(latch));
Thread thread2 = new Thread(new MyRunnable(latch));
Thread thread3 = new Thread(new MyRunnable(latch));

步骤3:执行需要等待的操作

在每个线程中,我们需要执行需要等待的操作。在操作完成后,调用CountDownLatch的countDown()方法,将计数器减1。在本例中,我们假设每个线程执行了一些耗时的操作,操作完成后调用countDown()方法。

public class MyRunnable implements Runnable {
    private CountDownLatch latch;
    
    public MyRunnable(CountDownLatch latch) {
        this.latch = latch;
    }
    
    @Override
    public void run() {
        // 执行需要等待的操作
        
        // 操作完成后调用countDown()方法
        latch.countDown();
    }
}

步骤4:主线程等待计数器为0

在主线程中,我们需要调用CountDownLatch的await()方法,等待计数器为0。这个方法会阻塞主线程,直到计数器为0。

try {
    latch.await();
    System.out.println("所有线程执行完毕,继续执行主线程");
} catch (InterruptedException e) {
    e.printStackTrace();
}

步骤5:所有线程执行完毕

当计数器为0时,表示所有线程都执行完毕,主线程可以继续执行其他操作。在本例中,我们在主线程中打印一条消息表示所有线程执行完毕。

3. 类图

以下是本例使用的类图。

classDiagram
    class CountDownLatch {
        -int count
        +CountDownLatch(int count)
        +void await() throws InterruptedException
        +void countDown()
    }
    class MyRunnable {
        -CountDownLatch latch
        +MyRunnable(CountDownLatch latch)
        +void run()
    }
    class Thread {
        +Thread(Runnable target)
        +void start()
    }

结尾

通过以上步骤和示例代码,你应该已经了解了如何使用Java多线程结合CountDownLatch来实现等待多个线程执行完毕的功能。希望本文能帮助你理解并掌握这个技术。如果你有任何问题或疑问,请随时提问。