1.CountDownLatch簡介

CountDownLatch經常用於監聽某些初始化操作,等初始化操作執行完畢後,通知當前線程繼續工作。

如下代碼,線程1會阻塞在countDown.await()處,需要等待線程2,3

import java.util.concurrent.CountDownLatch;

public class P01CountDownLatch
{
    public static void main(String[] args)
    {
        //2表示要等待兩次countDown()
        final CountDownLatch countDown = new CountDownLatch(2);
        Thread t1 = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {   
                    System.out.println("進入線程t1,等待其他線程處理完成");
                    countDown.await();//需要等待
                    System.out.println("t1線程繼續執行");
                }
                catch (InterruptedException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
        });
        Thread t2 = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    System.out.println("進入線程t2");
                    Thread.sleep(2000);
                    countDown.countDown();
                    System.out.println("t2線程執行完畢,通知t1線程繼續執行");
                }
                catch (InterruptedException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
               
                       
            }
        });
        Thread t3 = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    System.out.println("進入線程t3");
                    Thread.sleep(3000);
                    countDown.countDown();//如果這行註釋掉,t1線程永遠不會再執行了
                    System.out.println("t3線程執行完畢,通知t1線程繼續執行");
                }
                catch (InterruptedException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
               
                       
            }
        });
        t1.start();
        t2.start();
        t3.start();
    }
}


執行結果:

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