CountDownLatch 阻塞队列使用

Latch:门闩的意思。根据该类名的意思,我们就可以知道该类在多线中扮演的就是一个倒数门闩的角色,怎么理解呢?
首先呢,我们新建一个CountDownLacth对象时我们需要给他传一个int参数,这个参数代表它将倒数的次数,也就是说调用几次countDown方法后,他就会对线程放行。
那放行是什么意思呢,就是某一个线程在执行的过程中如果遇到CountDownLatch对象的await方法时,他就会被卡住,即阻塞,无法执行下面的代码。然后别的线程可以拿到该CountDownLatch对象,调用countDown方法,每次调用倒数次数就会减少一次,直到倒数次数为0,不可重置,倒数结束之后门闩就会对线程放行,线程就会被唤醒,执行完await下面的代码。这样就完成一个倒数运行机制。
下面我们模拟一个做菜的一个过程,完成一盘肠粉需要两个步骤,一是执行白菜的准备,一是执行粉皮的准备,当两个步骤执行完了之后,服务员就可以通知上菜,下面我们根据代码了解倒数门闩机制。
public class CountDownLatchTest {
public static void main(String[] args){
CountDownLatch valve = new CountDownLatch(2);
Thread waiter = new Thread(new Runnable() {
@Override
public void run() {
try {
valve.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“肠粉做好啦”);
}
});
Thread caiOffer = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(“正在准备白菜”);
for(int i=0;i<3;i++){
System.out.println(“制作白菜中”);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(“白菜准备好啦”);
valve.countDown();
}
});
Thread fenOffer = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(“正在准备粉皮”);
for(int i=0;i<3;i++){
System.out.println(“粉皮制作中”);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(“粉皮准备好啦”);
valve.countDown();
}
});
waiter.start();
fenOffer.start();
caiOffer.start();
}
}

猜你喜欢

转载自blog.csdn.net/a303549861/article/details/82051724