Java

CountDownLatch

2019-07-11  本文已影响0人  刘一一同学

1. 概述

CountDownLatch(多线程控制工具)能够使一个主线程等待其他线程完成各自的工作后再执行自己的任务。

2. 实现原理

CountDownLatch是通过一个计数器来实现的,计数器的初始值为需要等待的线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务。

2.1 核心方法

3. 代码示例

举个例子,CountDownLatch就像跑步比赛中的裁判,有3位运动员参加比较,其中2、3运动员已经到达终点。这时,裁判员不能因为2、3运动员到达终点就宣布比赛结束,而是要一直等待所有运动员到达终点。

public class CountDownLatchDemo implements Runnable {

    static final CountDownLatch latch = new CountDownLatch(5);
    static final CountDownLatchDemo demo = new CountDownLatchDemo();

    @Override
    public void run() {
        try {
            Thread.sleep(new Random().nextInt(10) * 1000);
            System.out.println("到达终点" + Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            // 计数减一
            // 放在finally避免任务执行过程出现异常,导致countDown()不能被执行。
            latch.countDown();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService exec = Executors.newFixedThreadPool(5);
        for (int i=0; i<5; i++){
            exec.execute(demo);
        }
        // 等待所有运动员到达终点
        latch.await();
        // 比赛结束
        System.out.println("End!");
        // 关闭线程池
        exec.shutdown();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读