JUC:05.CountDownLatch

lglglglglgui發表於2020-11-12

一、概述

CountDownLatch可以使得當前執行緒阻塞,直到當CountDownLatch中的計數器減少至0,當前執行緒才能繼續往下執行.與Thread中的join()方法類似。

二、常用方法

  • CountDownLatch(int count):指定計數器的值
  • public void await() throws InterruptedException:呼叫後當前執行緒阻塞,直到當計數器的值為0,方法返回,該方法可以響應中斷
  • public boolean await(long timeout, TimeUnit unit) throws InterruptedException:可以超時時間等待,如果在規定的時間內返回,就返回ture。否則返回false
  • public void countDown():讓計數器減1

三、案例

簡單使用

public class Demo1 {

    public static void main(String[] args) throws InterruptedException {
        int count = 5;
        CountDownLatch countDownLatch = new CountDownLatch(count);
        for (int i=1;i<=count;i++){
            Thread thread = new Thread(()->{
                try {
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    System.out.println(Thread.currentThread().getName()+"到達終點");
                    countDownLatch.countDown();
                }
            });
            thread.setName("執行緒"+i);
            thread.start();
        }
        System.out.println("main執行緒被阻塞,需要等待其他所有執行緒到達終點,才能繼續往下執行");
        countDownLatch.await();
        System.out.println("main執行緒繼續執行,執行結束");
    }
}

執行效果:

main執行緒被阻塞,需要等待其他所有執行緒到達終點,才能繼續往下執行
執行緒1到達終點
執行緒2到達終點
執行緒3到達終點
執行緒4到達終點
執行緒5到達終點
main執行緒繼續執行,執行結束

超時時間等待

public class Demo2 {
    public static void main(String[] args) throws InterruptedException {
        int count = 5;
        CountDownLatch countDownLatch = new CountDownLatch(count);
        for (int i=1;i<=count;i++){
            Thread thread = new Thread(()->{
                try {
                    int time = (int)(Math.random()*10+1);
                    TimeUnit.SECONDS.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    System.out.println(Thread.currentThread().getName()+"到達終點");
                    countDownLatch.countDown();
                }
            });
            thread.setName("執行緒"+i);
            thread.start();
        }
        System.out.println("main執行緒被阻塞,等待5秒其他執行緒到達終點");
        boolean flag = countDownLatch.await(6,TimeUnit.SECONDS);
        if (flag){
            System.out.println("main執行緒等待其他執行緒到達才結束");
        }else {
            System.out.println("mian執行緒等不及了,自己往下執行結束");
        }

    }
}

執行結果:

main執行緒被阻塞,等待5秒其他執行緒到達終點
執行緒5到達終點
執行緒4到達終點
mian執行緒等不及了,自己往下執行結束

相關文章