等待多线程完成的CountDownLatch

CountDownLatch允许一个或多个线程等待其他线程完成操作。

相当于是一个门栓,一开始是关闭的,所有希望通过该门的线程都需要等待,等待计数器变为0后,门栓打开,等待的所有线程都可以通过,它是一次性的,打开后就不能再关上了。

 

CountDownLatch里有一个计数,这个计数通过构造方法进行传递:

public CountDownLatch(int count)

多个线程可以基于这个计数进行协作,它的主要方法有:

public void await() throws InterruptedException
public boolean await(long timeout, TimeUnit unit) throws InterruptedException
public void countDown()

await检查计数是否为0,如果大于0,就等待,await可以被中断,也可以设置最长等待时间。countDown检查计数,如果已经为0,直接返回,否则减少计数,如果新的计数变为0,则唤醒所有等待的线程。

 

要实现主线程等待所有线程完成操作,最简单的做法是使用join()方法

public class JoinCountDownLatchTest {
    public static void main(String[] args) throws InterruptedException {
        Thread parser1 = new Thread(new Runnable() {
            @Override
            public void run() {
            }
        });
        Thread parser2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("parser2 finish");
            }
        });
        parser1.start();
        parser2.start();
        parser1.join();
        parser2.join();
        System.out.println("all parser finish");
    }
}

join用于让当前执行线程等待join线程执行结束。其实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远等待。

 

在JDK 1.5之后的并发包中提供的CountDownLatch也可以实现join的功能,并且比join的功能更多

public class CountDownLatchTest {
    static CountDownLatch c = new CountDownLatch(2);
    public static void main(String[] args) throws InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(1);
                c.countDown();
                System.out.println(2);
                c.countDown();
            }
        }).start();
        c.await();
        System.out.println("3");
    }
}

CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。

当我们调用CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,只需要把这个CountDownLatch的引用传递到线程里即可。

 

 

参考: Java编程的逻辑 19.3 倒计时门栓CountDownLatch

  Java并发编程的艺术 8.1 等待多线程完成的CountDownLatch

 

上一篇:LTE 核心 MME SGW PGW作用:


下一篇:Fakeapp 入门教程(2):使用篇!