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();
}
}
執行結果: