多线程编程(三)-CountDownLatch的使用

  • CountDownLatch的介绍

    类CountDownLatch是同步功能得一个辅助类,使用效果就是给定一个计数,当使用CountDownLatch类的线程判断计数不为0时,则呈wait状态,如果是0则继续运行。

    实现等待与继续运行的效果分别需要使用awit()和countDown()方法来进行。调用awit()方法时判断计数是否为0,如果不为0则呈等待状态。其他线程可以调用countDown()方法将计数减1,当计数减到0时,呈等待的线程继续运行。需要特别说明的是,计数无法被重置。

  • 实例

    模拟田径比赛,运动员准备

  

package com.wjg.unit_2_1_2;

import java.util.concurrent.CountDownLatch;

public class Run {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch maxRunner = new CountDownLatch(10);
        Run run = new Run();
        for (int i = 0; i < maxRunner.getCount(); i++) {
            MyThread thread = run.new MyThread(maxRunner);
            thread.setName("运动员"+(i+1));
            thread.start();
        }
        maxRunner.await();
        System.out.println("全部到了");
        
    }
    
    public class MyThread extends Thread{
        private CountDownLatch maxRunner;

        public MyThread(CountDownLatch maxRunner) {
            super();
            this.maxRunner = maxRunner;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(2000);
                System.out.println(this.getName()+"到了");
                maxRunner.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
        }
        
        
    }
}


运行结果:

运动员4达到了
运动员5达到了
运动员2达到了
运动员10达到了
运动员3达到了
运动员9达到了
运动员8达到了
运动员1达到了
运动员7达到了
运动员6达到了

全部到了    
  • 方法awit(long timeout,TimeUnit unit)

    作用是使线程在指定的最大时间单位内进入WAITING状态,如果超过这个时间则自动唤醒,程序继续向下执行。    

  • 方法getCount()

    获取当前CountDownLatch的值。

原文地址:https://www.cnblogs.com/niceplay/p/6474751.html