Java文档解释:CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。
主要方法:
public CountDownLatch(int count);构造方法,传入count,表示前面有几个线程要先完成。
public void countDown(); 前面要完成的线程执行完后调用该方法,count会-1。
public void await() throws InterruptedException 要阻塞的线程,我们希望其他线程完成后再执行这个线程,就在这个线程中调用await().
使用:
假如有A ,B ,C三个线程。我们希望A,B完成以后C再执行。
此时,我们先定义出CountDownLatch:
CountDownLatch countDownLatch=new CountDownLatch(2)
在A线程中完成自己的任务后调用:
countDownLatch.countDown();
在B线程中操作完成后调用:
countDownLatch.countDown();
在C线程中执行操作前先调用:
countDownLatch.await();
调用时,我们new出A,B,C三个线程,同时start();然后这三个线程就会按照我们预期的顺序完成。
代码如下:
final CountDownLatch countDownLatch = new CountDownLatch(2);
Thread A = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println("A县城");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
}
});
Thread B = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
System.out.println("B县城");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
}
});
Thread C = new Thread(new Runnable() {
@Override
public void run() {
try {
countDownLatch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("C县城");
}
});
A.start();
B.start();
C.start();
代码中如果没有用到CountDownLatch时输出顺序应该是C,A,B.
加入CountDownLatch后输出顺序为A,B,C.