作用

等待其他线程执行完后,在执行某个线程。类似之前的join,但是比join更强大。join可以多个线程插队到A线程,A线程等多个线程结束后才执行(类似后面的CyclicBarrier),而CountDownLatch可以等待多个线程执行完才执行,灵活性比join更大。

主要方法

  1. countDown,计数器减1。这个方法可以一个线程执行一次,也可以一个线程执行多次。
  2. await,堵塞,等计数减为0的时候,才继续执行。

示例

public class CountDownLatchDemo {
    static CountDownLatch countDownLatch = new CountDownLatch(2);

    static class Thread1 implements Runnable {
        @Override
        public void run() {
            countDownLatch.countDown();
            System.out.println(Thread.currentThread().getName() + ":" + 1);
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ":" + 2);
            countDownLatch.countDown();
        }
    }

    public static void main(String[] args) {
        Thread thread =new Thread(new Thread1(),"thread");
        thread.start();
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + ":" + 3);
    }
}

执行结果如下:
clipboard.png
虽然线程thread休眠了2秒,但是main依然等到线程thread输出2后,才输出3。


大军
847 声望183 粉丝

学而不思则罔,思而不学则殆