您的位置:首页 > 常识科普 >countdownlatch(CountdownLatch:多线程编程中的“倒计时门闩”)

countdownlatch(CountdownLatch:多线程编程中的“倒计时门闩”)

摘要 CountdownLatch:多线程编程中的“倒计时门闩” 介绍 CountdownLatch,翻译过来叫做“倒计时门闩”,是java.util.concurrent包中提供的一个同步工具类。它可以允许一个或多个线程...

CountdownLatch:多线程编程中的“倒计时门闩”

介绍

CountdownLatch,翻译过来叫做“倒计时门闩”,是java.util.concurrent包中提供的一个同步工具类。它可以允许一个或多个线程等待其他线程的操作完成后再继续执行。

使用场景

CountdownLatch的典型应用是在多线程程序中,等待多个线程的某个特定操作完成。例如,我们有一个任务,需要多个工人一起完成。我们希望等待所有工人完成后再继续向下执行。这时,我们可以使用CountdownLatch。

还有一种常见的使用场景是模块测试,有时候我们需要同时启动多个线程来测试一些接口,但这些接口之间又有顺序要求,我们可以使用CountdownLatch将它们串联起来执行。

实现步骤

初始化CountdownLatch

先来看一下CountdownLatch的构造函数:

public CountdownLatch(int count) {
    if (count < 0) throw new IllegalArgumentException(\"count < 0\");
    this.sync = new Sync(count);
}

其中,count参数指定了计数器的初始值。当计数器的值为0时,等待线程可以继续执行。Sync是CountdownLatch内部定义的一个同步器。

示例代码如下:

CountdownLatch latch = new CountdownLatch(3);

这里我们初始化了一个计数器为3的CountdownLatch。

等待其他线程

等待其他线程是CountdownLatch的核心方法之一,它可以让一个或多个线程在计数器减到0之前一直等待。

方法定义如下:

public void await() throws InterruptedException {
    sync.acquireSharedInterruptibly(1);
}

需要注意的是,调用此方法的线程会被挂起,直到其他线程调用了countDown()方法使计数器减到0,或者当前线程被中断。

减少计数器的值

CountdownLatch提供了countDown()方法,用于减少计数器的值。当某个线程调用了此方法后,计数器的值就会减1。

方法定义如下:

public void countDown() {
    sync.releaseShared(1);
}

需要注意的是,如果计数器的值已经为0,再次调用countDown()方法会抛出IllegalStateException异常。

完整示例

下面我们来实现一个简单的示例,有3个线程同时执行,但必须先等待countDown()方法被调用三次后才能继续执行。

public class CountdownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        // 初始化CountdownLatch
        final CountDownLatch latch = new CountDownLatch(3);
 
        // 创建3个线程
        for (int i = 0; i < 3; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + \" working...\");
                    try {
                        Thread.sleep((long) (Math.random() * 1000));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + \" finished.\");
                    // 调用countDown()方法减少计数器的值
                    latch.countDown();
                }
            }).start();
        }
 
        // 等待所有线程执行完成
        latch.await();
        System.out.println(\"All threads finished.\");
    }
}

运行上述代码,可以得到如下输出:

Thread-0 working...
Thread-1 working...
Thread-2 working...
Thread-0 finished.
Thread-2 finished.
Thread-1 finished.
All threads finished.

可以看到,所有线程都已经完成了,而且是在CountdownLatch的作用下一起完成的。

结语

CountdownLatch是一种同步机制,它可以让一个或多个线程等待其他线程的某个特定操作完成后再继续执行。这种同步机制可以避免一些不必要的等待,提高程序效率。

CountdownLatch只是java.util.concurrent包中众多同步工具类之一,在多线程编程中有着广泛的应用,值得我们深入学习和研究。

版权声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。