juc并发工具类之CountDownLatch闭锁

时间:2023-01-28 20:50:52
import java.util.concurrent.CountDownLatch;

/**
* 闭锁: 在进行某些运算时, 只有其他所有线程的运算全部完成,当前运算才继续执行(程序流中加了一道栅栏)
* 联想: 相当于水电站的水坝, 会拦截上游的水, 当积累到一定水位才放水.
* 马场赛马,需要所有的马跑完比赛才能公布比赛的排名结果
*
*
*/
//计算多线程程序执行时间 : 分线程执行完的时间 + 主线程执行的时间(分线程必须全部在结算前执行完)
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
long start = System.currentTimeMillis();

//1.初始化CountDownLatch计算线程的数量 10
CountDownLatch latch = new CountDownLatch(10);
LatchTask latchTask = new LatchTask(latch);

for (int i = 0; i < 10; i++) {
new Thread(latchTask).start();
}

//4.阻塞主线线程, 当CountDownLatch计数为0时才会继续执行
latch.await();

long end = System.currentTimeMillis();
System.out.println("程序消耗时间" + (end - start));
}
}

class LatchTask implements Runnable{

//2.所有线程共有一个CountDownLatch计数
private CountDownLatch latch;
LatchTask(CountDownLatch latch){
this.latch = latch;
}

@Override
public void run() {
synchronized (this){
try {
for (int i = 0; i < 1000; i++) {
if(i % 2 == 0){
System.out.println(i);
}
}
} finally {
//3. 一个线程执行完后计数减1
latch.countDown();
}
}
}
}