CountDownLatch是用来干嘛的?
CountDownLatch是java并发包中提供一个工具类,可以实现类似join()方法的功能。我们可以使用一个题目来简单看下CountDownLatch的使用。
public class Foo {
public void one() {
System.out.println("one");
}
public void two() {
System.out.println("two");
}
public void three() {
System.out.println("three");
}
}
三个不同的线程将会共用一个 Foo 实例。
- 线程 A 将会调用 one() 方法-
- 线程 B 将会调用 two() 方法
- 线程 C 将会调用 three() 方法
请设计修改程序,以确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行
下面我们来看看如何使用CountDownLatch实现该功能,不多说,上代码:
import java.util.concurrent.CountDownLatch;
public class Foo {
private CountDownLatch second = new CountDownLatch(1);
private CountDownLatch third = new CountDownLatch(1);
public void one() {
System.out.println("one");
second.countDown();
}
public void two() throws InterruptedException {
second.await();
System.out.println("two");
third.countDown();
}
public void three() throws InterruptedException {
third.await();
System.out.println("three");
}
public static void main(String[] args) {
final Foo foo = new Foo();
new Thread(new Runnable() {
@Override
public void run() {
foo.one();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
foo.three();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
foo.two();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
总结:由于CountDownLatch的countDown()方法可以在任何地方使用,因此可以用来做程序的顺序控制,在one打印之后就可以调用second的countDown()方法,于是,就可以唤醒执行two()的i线程