CountDownLatch :闭锁,在完成某些运算时,只有其他所有线程的运算全部完成,当前运算才继续执行
方法:
countDown():减少锁存器的计数,如果计数达到零,释放所有等待的线程
await():导致当前线程等到锁存器向下计数为零,除非线程为 interrupted
案例分析:
我们要统计50个线程执行完LatchDemo中的run()之后的时间,这时我们需要在LatchDemo中定义一个CountDownLatch闭锁 CountDownLatch创建的时候可以给定一个初始化值
public class CountDownLatchTest {
public static void main(String[] args) {
//构造一个以给定计数初始化的 CountDownLatch
//初始值即为要统计的线程数
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();
}
/*
调用CountDownLatch的await()方法,只有该对象的锁存器计数为0时,即
线程全部走完后,程序才会继续往下走
这时就能统计出来50个线程都执行完之后的时间
*/
try {
latch.await();
} catch (InterruptedException e) {
}
long end = System.currentTimeMillis();
System.out.println("耗费时间为:" + (end - start));
}
}
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 {
//当线程执行完run方法之后,调用countDown()使锁存器计数减1
latch.countDown();
}
}
}