介绍
CountDownLatch被new出来的时候会指定调用次数n,如:
final CountDownLatch countDownLatch=new CountDownLatch(n);
线程最开始会调用countDownLatch.await();陷入阻塞状态,当n次调用
countDownLatch.countDown();之后,线程从阻塞状态中恢复过来,继续执行下面的操作。
案例
public class CountDownLatchDemo {
public static void main(String[] args) {
//数值2表示:需要执行2次countDownLatch.countDown(); 线程才会取消阻塞
final CountDownLatch countDownLatch=new CountDownLatch(2);
Thread t1=new Thread(new Runnable() {
public void run() {
try {
System.out.println("进入线程t1"+"等待其他线程处理完成...");
//线程t1被阻塞在这里,需要countDown两次才能继续往下执行
countDownLatch.await();
System.out.println("t1线程继续执行...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"t1");
Thread t2=new Thread(new Runnable() {
public void run() {
try {
System.out.println("t2线程进行初始化操作...");
Thread.sleep(3000);
System.out.println("t2线程初始化完成,通知t1线程继续...");
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t3=new Thread(new Runnable() {
public void run() {
try {
System.out.println("t3线程进行初始化操作...");
Thread.sleep(4000);
System.out.println("t3线程初始化操作完成,通知t1线程继续...");
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
t3.start();
}
}
线程t1一开始会陷入阻塞状态,只有等线程t2和t3全部执行完后,才能继续执行下面的操作。线程t2和t3分别调用了countDownLatch.countDown();一次,使得线程t1从阻塞状态中恢复,而后继续往下执行。

1246

被折叠的 条评论
为什么被折叠?



