java多线程[6]:CountDownLatch

来源:互联网 发布:怎么设定网络熟读 编辑:程序博客网 时间:2024/06/05 19:24

CountDown的意思是倒数,latch的意思是门锁。CountDownLatch大概可以理解为:倒数几个数之后,门就打开了。具体来讲,CountDownLatch的工作机制是:它内部维护了一个倒计时数字,每次调用countDown()方法,这个数字就减一,当这个数字降为0后,门就开了。当一个线程调用它的await()方法时,如果门没开(倒计时数字大于0)的话,则调用await方法的线程会挂起,直到门开后,该线程被唤醒然后继续运行。它的工作机制和Thread类的join方法有些类似。

来看一个例子。假设我在main方法中启动了好多个个工作者线程,我希望等这些工作者线程都运行结束了以后,main方法再退出。先来看工作者线程的代码

public class MyWorker implements Runnable {    String name;    CountDownLatch latch;    public MyWorker(String workerName, CountDownLatch latch) {        this.name = workerName;        this.latch = latch;        new Thread(this).start();    }    @Override    public void run() {        for (int i = 0; i < 10; i++) {            // do something here            // ...            try {                Thread.sleep(500);            } catch (InterruptedException e) {                e.printStackTrace();            }        }        System.out.println(name + " exit");        latch.countDown();    }}

下面是main方法

public class CountDownLatchDemo {    public static void main(String[] args) throws InterruptedException {        int workerCount = 10;        CountDownLatch latch = new CountDownLatch(workerCount);        for (int i = 0; i < workerCount; i++) {            new MyWorker("worker" + i, latch);        }        latch.await();        System.out.println("main thread exit");    }}

在main方法中初始化了一个CountDownLatch对象,它的初始值是10,然后启动了10个worker thread,再然后调用latch.await()等待门被打开。每个worker thread要工作很久,当工作结束后,会调用latch.countDown()来倒数一个数,等到所有的worker thread都完成了自己的工作,CountDownLatch的门就打开了,此时main方法继续运行。最终,main方法所在的主线程要晚于所有工作者线程结束。

下面是这个demo的运行结果。每次运行输出的内容可能都不一样,但都是主线程最后才退出。

worker6 exitworker4 exitworker3 exitworker7 exitworker5 exitworker0 exitworker8 exitworker1 exitworker2 exitworker9 exitmain thread exit
原创粉丝点击