1: 为什么需要countDownLatch
1.1 CountDownLatch同步计数器,当计数器数值减为0时,所有受其影响而等待的线程将会被激活,这样保证模拟并发请求的真实性。
1.2 面试的时候会被问到
2: 概念
CountDownLatch位于package java.util.concurrent 包下,是一个用来协调线程同步的通信类,CountDownLatch内部通过一个计数器,能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。
3:源代码
// 每次将count减1
public void countDown() { sync.releaseShared(1);}
// 让调用该方法的线程挂起,直到count被减到0
public void await()throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
4:示例
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchTest {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(3);
System.out.println("主线程开始执行…… ……");
//第一个子线程执行
ExecutorService pool = Executors.newFixedThreadPool(3);
for(int i=0;i<3;i++){
Runnable runnable = new Runnable() {
public void run() {
try{
System.out.println("线程名称:"+Thread.currentThread().getName()+"执行开始");
Thread.sleep(1000);
System.out.println("线程名称:"+Thread.currentThread().getName()+"执行结束");
latch.countDown(); // 每个线程执行减1
} catch (Exception e){
e.printStackTrace();
}
}
};
pool.execute(runnable); // 线程执行
}
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("子线程都执行完成,继续执行主线程");
}
}
输出:
主线程开始执行…… ……
线程名称pool-1-thread-1执行开始
线程名称pool-1-thread-3执行开始
线程名称pool-1-thread-2执行开始
线程名称pool-1-thread-3执行结束
线程名称pool-1-thread-1执行结束
线程名称pool-1-thread-2执行结束
子线程都执行完成,继续执行主线程
网友评论