基于信号量的线程阻塞工具。 用在某个线程等待其他线程执行完毕,再继续执行。
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("主线程执行完成");}}
