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(); } }
执行结果: