闭锁源码解析

166 阅读1分钟

什么是闭锁

闭锁是一种java的工具类,闭锁可以用来确保某些活动知道其他活动都完成后才继续执行后续操作。比如一场电脑游戏,需要等待所有玩家的初始化工作都完成之后才能开始游戏。有些场景下则需要两个闭锁,比如一场跑步比赛,所有的运动远需要同时从起点出发,并且需要等所有的运动员都跑过终点才能公布比赛结果。CountDownLatch是一种灵活的闭锁实现,闭锁状态包含一个正数的计数器,表示需要等待的事件的数量。countDown方法递减计数器,await方法起到阻塞作用,await方法会一直阻塞直到计数器为零,或者等待中的线程中断,或者等待超时。

import java.util.concurrent.CountDownLatch;

public class RunningContest {
    public void run(int i){
        System.out.println("运动" + i + "到达比赛终点!");
    }

    public void end(){
        System.out.println("公布比赛成绩!");
    }

    public void start(int n, RunningContest runningContest) throws InterruptedException{
        final CountDownLatch startContest = new CountDownLatch(1);
        final CountDownLatch endContest = new CountDownLatch(n);

        for(int i = 1; i <= n; i++){
            final int k = i;
            new Thread(){
                public void run(){
                    try{
                        startContest.await();
                        try{
                            runningContest.run(k);
                        }finally {
                            endContest.countDown();
                        }
                    }catch (InterruptedException e){}
                }
            }.start();
        }
        // 比赛开始
        startContest.countDown();
        // 等待所有运动员通过终点
        endContest.await();
        // 公布比赛结果
        end();
    }

    public static void main(String[] args) throws InterruptedException {
        RunningContest runningContest = new RunningContest();
        runningContest.start(5, runningContest);
    }
}

运动4到达比赛终点!
运动3到达比赛终点!
运动2到达比赛终点!
运动1到达比赛终点!
运动5到达比赛终点!
公不比赛成绩!

startContest用于控制所有运动员在起跑线等待,startContest.countDown()相当于比赛开始的哨声。endContest.await()等待所有远动员都通过终点才能进行之后公布比赛成绩的操作。