victory的博客

长安一片月,万户捣衣声

0%

并发 | CountDownLatch

CountDownLatch

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

CountDownLatch c = new CountDownLatch(2);

CountDownLatch的构造函数接收一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N.
当我们调用CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await方法会阻塞当前
线程,直到N变为0。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以
是1个线程里的N个步骤

注:CountDownLatch的计数器智能使用一次

示例代码1

package concurrency.countdownlatch;

import java.util.concurrent.CountDownLatch;

public class CountDownLatchTest1 {
    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("parser1 finished");
                c.countDown();
            }
        }).start();
        
        new Thread(new Runnable(){
            @Override
            public void run() {
                System.out.println("parser2 finished");
                c.countDown();
            }
        }).start();
        c.await();
        System.out.println("all parsers finished");
    }
}

示例代码2

package concurrency.countdownlatch;

import java.util.concurrent.CountDownLatch;

public class CountDownLatchTest2 {
    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