基于信号量的线程阻塞工具。 用在某个线程等待其他线程执行完毕,再继续执行。
CountDownLatch 初始设定信号量
countDown() 任何线程都可以调用 countDown() 将信号量减一 (本线程也可调用,单线程内可调用多次)
await()方法,阻塞一个到多个线程。
当信号量归0,阻塞释放。
阻塞的过程是通过AQS实现的, 使用自旋锁循环监控阻塞状态。
public class CountLatchTest {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i = 0; i <5 ; i++) {
new Thread(()->{
System.out.println("开始执行"+Thread.currentThread());
try {
Thread.sleep(1000 + Math.round( Math.random()*1000));
} catch (InterruptedException e) {}
countDownLatch.countDown();
System.out.println("执行结束"+Thread.currentThread());
}).start();
}
countDownLatch.await();
System.out.println("主线程执行完成");
}
}
以下实例,阻塞多个线程,使得多个线程阻塞在某一步,信号量归0,继续一起执行。
如以上,多个线程都开始后,打出了开始输出,再继续往下执行。
public class CountLatchTest {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i = 0; i <5 ; i++) {
new Thread(()->{
try {
System.out.println("开始执行"+Thread.currentThread());
countDownLatch.countDown();
//阻塞
countDownLatch.await();
System.out.println("执行结束"+Thread.currentThread());
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
//阻塞
countDownLatch.await();
System.out.println("主线程执行完成");
}
}