public class CountDownLatchDemo {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(2);
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep((long) (Math.random() * 30000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("1进来了");
countDownLatch.countDown();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep((long) (Math.random() * 300));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("2进来了");
countDownLatch.countDown();
}
}).start();
try {
countDownLatch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("结束了");
}
CountDownLatch 只有当计数为0 的时候才会放行, 所以不管上面两个线程,只有当两个线程都完成的时候才会输出最后一句话“结束了”,至于为什么CountDownLatch 是线程安全的。 我点进去看了, countDownLatch 里面有个静态内部类Sync 继承了Aqs,执行CountDown()的时候走父类release, 然后走sync 的tryRelease 。 至于静态内部类为什么是线程安全的?找资料中