CountDownLatch類淺析

CountDownLatch內部維護了一個計數器,只有當計數器==0時,某些線程纔會停止阻塞,開始執行。

就好比火箭發射,只有當讀秒從10->1之後才執行發射動作一樣。

構造方法摘要
CountDownLatch(int count)
構造一個用給定計數初始化的 CountDownLatch
常用方法
await()
使當前線程在鎖存器倒計數至零之前一直等待,除非線程被中斷。
await(long timeout, TimeUnit unit)
使當前線程在鎖存器倒計數至零之前一直等待,除非線程被中斷或超出了指定的等待時間。
countDown()
遞減鎖存器的計數,如果計數到達零,則釋放所有等待的線程。

CountDownLatch主要有兩個方法,countDown()來讓計數器-1,await()來讓線程阻塞。當count==0時,阻塞線程自動喚醒。

舉例演示:

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {

        CountDownLatch countDownLatch=new CountDownLatch(10);

        for (int i = 10; i > 0; i--) {

            new Thread(()->{

                try {
                    System.out.println(Thread.currentThread().getName()+"準備發射事宜~");
                    Thread.sleep(2*1000);
                    System.out.println(Thread.currentThread().getName()+"準備完畢~");
                    countDownLatch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            },String.valueOf("線程")+(11-i)).start();

        }

        countDownLatch.await();

        System.out.println(Thread.currentThread().getName()+"發射~");

    }
}

結果:

線程1準備發射事宜~
線程3準備發射事宜~
線程2準備發射事宜~
線程4準備發射事宜~
線程5準備發射事宜~
線程6準備發射事宜~
線程7準備發射事宜~
線程8準備發射事宜~
線程9準備發射事宜~
線程10準備發射事宜~
線程1準備完畢~
線程2準備完畢~
線程4準備完畢~
線程5準備完畢~
線程3準備完畢~
線程9準備完畢~
線程8準備完畢~
線程10準備完畢~
線程7準備完畢~
線程6準備完畢~
main發射~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章