闭锁:一种同步工具类,可以用来确保某些活动指导其他活动都完成后才执行。
CountDownLatch:一种闭锁的实现,可以使一个或多个线程等待一组事件发生。
使用方法
- 初始化
在初始化时,可以在CountDownLatch的构造方法中给count赋一个初始值
例:CountDownLatch cd = new CountDownLatch(5);
此时count = 5 - countDown()
每调用一个countDown(),实例中的count计数会减少一
例:cd.countDown() count减少一就变为4 - await()
await是阻塞式方法,直到cd中的count为零时才能执行后面的代码,否则一直阻塞
CountDownLatch在使用中常用来转异步为同步
1.赛跑例子: 选手赛跑游戏:
当比赛开始时,
(选手)开始启动
当所有选手跑完后,
比赛结束
当运动员开始启动时(各个线程启动)异步的过程。。。
当等待全部运动员完成后,比赛结束 同步的过程。。。。
import java.util.concurrent.CountDownLatch;
/**
* CountDownLauch的测试
* 选手赛跑游戏:
* 当比赛开始时,
* 多线程(选手)开始启动
* 当所有选手跑完后,
* 比赛结束
*/
public class CountDownLauchdemo {
//比赛开始指令
private static CountDownLatch start = new CountDownLatch(1);
//比赛结束指令
private static CountDownLatch end = new CountDownLatch(10);
public static void main(String[] args) {
Competition competition = new Competition(start, end);
//比赛开始
start.countDown();
System.out.println("the race begin");
for(int i=0;i<10;i++){
new Thread(competition).start();
}
try {
end.await();
System.out.println("the race is end");
} catch (InterruptedException e) {
}
}
}
class Competition implements Runnable{
private CountDownLatch start;
private CountDownLatch end;
public Competition(CountDownLatch start,CountDownLatch end){
this.start = start;
this.end = end;
}
public void run() {
//等待比赛开始 阻塞式方法
try {
start.await();
//比赛开始后线程开始跑
System.out.println(Thread.currentThread().getName()+"arrvied");
//线程跑完后释放锁
end.countDown();
} catch (InterruptedException e) {
}
}
}
2.应用距离 分布计算求和
在电商项目中,需要多线程分布计算每一个类别商品的销售额等一些信息,我们可以用多线程加快计算速度,但最后需要求出每种类别总和,这也是一个异步转为同步的过程。