基于信号量的线程阻塞工具。 用在某个线程等待其他线程执行完毕,再继续执行。

    CountDownLatch 初始设定信号量
    countDown() 任何线程都可以调用 countDown() 将信号量减一 (本线程也可调用,单线程内可调用多次)
    await()方法,阻塞一个到多个线程。

    当信号量归0,阻塞释放。

    阻塞的过程是通过AQS实现的, 使用自旋锁循环监控阻塞状态。

    1. public class CountLatchTest {
    2. public static void main(String[] args) throws InterruptedException {
    3. CountDownLatch countDownLatch = new CountDownLatch(5);
    4. for (int i = 0; i <5 ; i++) {
    5. new Thread(()->{
    6. System.out.println("开始执行"+Thread.currentThread());
    7. try {
    8. Thread.sleep(1000 + Math.round( Math.random()*1000));
    9. } catch (InterruptedException e) {}
    10. countDownLatch.countDown();
    11. System.out.println("执行结束"+Thread.currentThread());
    12. }).start();
    13. }
    14. countDownLatch.await();
    15. System.out.println("主线程执行完成");
    16. }
    17. }

    以下实例,阻塞多个线程,使得多个线程阻塞在某一步,信号量归0,继续一起执行。

    如以上,多个线程都开始后,打出了开始输出,再继续往下执行。

    1. public class CountLatchTest {
    2. public static void main(String[] args) throws InterruptedException {
    3. CountDownLatch countDownLatch = new CountDownLatch(5);
    4. for (int i = 0; i <5 ; i++) {
    5. new Thread(()->{
    6. try {
    7. System.out.println("开始执行"+Thread.currentThread());
    8. countDownLatch.countDown();
    9. //阻塞
    10. countDownLatch.await();
    11. System.out.println("执行结束"+Thread.currentThread());
    12. } catch (InterruptedException e) {
    13. e.printStackTrace();
    14. }
    15. }).start();
    16. }
    17. //阻塞
    18. countDownLatch.await();
    19. System.out.println("主线程执行完成");
    20. }
    21. }