这是java.util.concurrent包里的一个同步辅助类,它有两个主要的常用方法 countDown()方法以及await()方法。在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
这个类可以帮助我们做什么事呢?
二,实例运行
列举一个场景,三个人赛跑,哨声一响同时出发,跑到一半时A选手突然觉得拿名次没什么意思,当最后一名也挺好,然后他就让B,C先跑到终点,然后自己再跑。
这里我们可以开三个线程模拟三位选手,看看我们怎么通过这两个重要方法来实现A选手的想法的。
代码如下,不妨先复制一下,跑起来再说。
public class Sample { /** * 计数器,用来控制线程 * 传入参数2,表示计数器计数为2 */ private final static CountDownLatch mCountDownLatch = new CountDownLatch(2); /** * A线程类 */ private static class ThreadA extends Thread { @Override public void run() { System.out.println("A选手 出发!"); try { // 会阻塞在这里等待 mCountDownLatch 里的count变为0; // 也就是等待另外的WorkingThread调用countDown() mCountDownLatch.await(); } catch (InterruptedException e) { } System.out.println("A选手 到终点拉!"); } } /** * BC线程类 */ private static class WorkingThread extends Thread { private final String mThreadName; private final int mSleepTime; public WorkingThread(String name, int sleepTime) { mThreadName = name; mSleepTime = sleepTime; } @Override public void run() { System.out.println("[" + mThreadName + "] 出发!"); try { Thread.sleep(mSleepTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("[" + mThreadName + "] 到终点拉!"); mCountDownLatch.countDown(); } } public static void main(String[] args) throws Exception { // 最先run ThreadA new ThreadA().start(); new WorkingThread("B选手", 2000).start(); new WorkingThread("C选手", 2000).start(); } }