CountDownLatch:闭锁
它被用来同步一个或多个任务,强制它们等待由其他任务执行的一组操作完成。
你可以向CountDownLatch对象设置一个初始计数值,任何在这个对象上调用wait()的方法都将阻塞,直至这个计数值到达0,其它任务在结束其工作时,可以在该对象上调用CountDown()来减小这个计数值。
package com.tongtong.app3;
import java.util.concurrent.CountDownLatch;
/**
* CountDownLatch:闭锁,在完成某些运算时,只有其他所有线程的运算全部完成,当前运算才继续执行
*/
public class TestCountDownLatch {
public static void main(String[] args){
final CountDownLatch latch = new CountDownLatch(50); //此值需和线程数相同
LatchDemo ld = new LatchDemo(latch);
long start = System.currentTimeMillis();
for(int i = 0; i < 50; i++){
new Thread(ld).start();
}
try {
latch.await(); //阻塞,让主线程等待,直到计数值到达0
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("耗费时间为:" + (end - start)); //主线程需要计算程序耗时,则需要等待50个线程执行完成以后才能执行
}
}
class LatchDemo implements Runnable{
private CountDownLatch latch;
public LatchDemo(CountDownLatch latch){
this.latch = latch;
}
@Override
public void run() {
try{
for(int i = 0; i < 50000; i++){
if(i % 2 == 0){
System.out.println(i);
}
}
}finally {
latch.countDown(); //每次都递减1
}
}
}