CountDownLatch使用说明 - Java线程并发工具

CountDownLatch是一种java.util.concurrent包下一个同步工具类。它可以让≥1个线程等待一组其它线程的操作执行完成。

【翻译】CountDown是倒计时,Latch是门闩。

  1、CountDownLatch end = new CountDownLatch(N); // 新建倒计时锁,容量是N

  2、end.await()  // 阻塞线程。直到调用N次end.countDown() 方法才释放线程

  3、end.countDown() // 倒数1个数。(计算调用次数是所有线程调用次数的总和)

import java.util.concurrent.CountDownLatch;

public class Test {
    // 模拟了100米赛跑,10名选手已经准备就绪,只等裁判一声令下。当所有人都到达终点时,比赛结束。
    public static void main(String[] args) throws InterruptedException {
        // 开始的倒数锁
        final CountDownLatch begin = new CountDownLatch(1);
        // 结束的倒数锁
        final CountDownLatch end = new CountDownLatch(10);
        for (int index = 0; index < 10; index++) {
            final int NO = index + 1;
            Runnable run = new Runnable() {
                public void run() {
                    try {
                        // 如果当前计数为零,则此方法立即返回。
                        begin.await();// 等待begin的信号
                        Thread.sleep((long) (Math.random() * 10000));
                        System.out.println("No." + NO + " arrived");
                    } catch (InterruptedException ignored) {
                    } finally {
                        end.countDown(); // 每个选手到达终点时,end就减一
                    }
                }
            };
            new Thread(run).start();
        }
        System.out.println("Game Start");
        begin.countDown();      // begin减一,开始游戏
        end.await();            // 等待end变为0,即所有选手到达终点
        System.out.println("Game Over");
    }
}

运行结果

Game Start
No.7 arrived
No.2 arrived
No.8 arrived
No.1 arrived
No.3 arrived
No.5 arrived
No.9 arrived
No.6 arrived
No.10 arrived
No.4 arrived
Game Over

Ref.

CountDownLatch 使用说明 - 猫咪大王 - 博客园

CountDownLatch的介绍和使用 | itzhai

发布了80 篇原创文章 · 获赞 22 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/u010099177/article/details/94733562