Java并发编程-JUC-CountDownLatch 倒计数门闩器-等待多线程完成再放行 -一次性使用

如题 (总结要点)

  • CountDownLatch 倒计数门闩器,
  • 让1-n-1个线程等待其他多线程完成工作。
  • (Excel的多个Sheet的解析,最终等待解析完毕后;要实现主线程等待所有线程完成sheet解析操作,最简单的就是join )
  • CountDownLatch latch = new CountDownLatch(2); // 使用倒计数门闩器 ,迫使主线程进入等待 ;设置N个结点 ,n个线程或者步骤
  • latch.countDown();
  • latch.await(1000, TimeUnit.MILLISECONDS); //阻塞当前线程,直到计数器变为0
  • 原文链接 :

借鉴学习文章列表

  • ALiBaBaJavaCodingGuideLines有话说 :
    • 使用线程池更佳!

1.测试1 简单测试


public class Test03_countdownlatch {
    public static void main(String[] args) {

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello ");
            }
        };
        Thread thread1 = new Thread(runnable);
        Thread thread2 = new Thread(runnable);
        System.out.println("all thread finish");
    }
}

2. 结果1 : 线程还没有来得及执行完毕,主线程就结束了,所以先打印的finish

all thread finish
hello 
hello 

3.测试2 迫使主线程通过子线程的join方法等待当前的子线程执行完毕

 public static void main(String[] args) {

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello ");
            }
        };
        Thread thread1 = new Thread(runnable);
        Thread thread2 = new Thread(runnable);

        thread1.start();
        thread2.start();

        try {
            // 迫使主线程通过join方法等待当前的子线程执行完毕
            thread1.join();
            // 主线程第二次等待
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("all thread finish");
    }

测试结果2

hello 
hello 
all thread finish

测试3 使用倒计数门闩器

public static void main(String[] args) {

        Runnable runnable = () -> System.out.println("hello ");
        Thread thread1 = new Thread(runnable);
        Thread thread2 = new Thread(runnable);

        // 使用倒计数门闩器 ,迫使主线程进入等待 ;设置N个结点 ,n个线程或者步骤都可以
        CountDownLatch latch = new CountDownLatch(2);
        thread1.start();
        latch.countDown();
        thread2.start();
        latch.countDown();

        try {
            // 阻塞当前线程,直到计数器变为0; await(long time);也可以带时间!
            latch.await(1000, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("all thread finish");


    }

测试结果3

hello 
hello 
all thread finish

猜你喜欢

转载自www.cnblogs.com/zhazhaacmer/p/11365805.html
今日推荐