CountDownLatch这个类是一个同步的辅助类,有的地方翻译成门闩,有的地方翻译成计数器。具体来说起到什么作用,多线程的东西都不太能说清楚,仅举个例子再来谈一下。
需求:在主线程里面开启两个线程,两个线程要做自己的事情,你可以怎么做,你可以用原生的API来做,例如这样:
Thread t1=new Thread(()->{ try{ //TODO }catch (Exception e){ e.printStackTrace(); } }); Thread t2=new Thread(()->{ try{ //TODO }catch (Exception e){ e.printStackTrace(); } }); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println("主线程执行完毕");
或者使用CountDownLatch,可以用下面这种形式
public class TestCountDownlatch { private static CountDownLatch countDownLatch=new CountDownLatch(2); public static void main(String[] args) throws InterruptedException { new Thread(()->{ try { Thread.sleep(3000); countDownLatch.countDown(); System.out.println(Thread.currentThread().getName()+"执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); new Thread(()->{ try { Thread.sleep(5000); countDownLatch.countDown(); System.out.println(Thread.currentThread().getName()+"执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); countDownLatch.await(); System.out.println(Thread.currentThread().getName()+"执行完毕"); } }
我们看到在CountDownLatch初始化时,构造器中传入了一个数字,这个数字就是来初始化,让CountDownLatch来帮你管理几个线程的,内部会维护一个计数器,当调用countDown()方法时,会将这个计数器减一,调用await方法时,会检查countDownLatch内部维护的计数器是否为0,否则就会一直阻塞在这里,直到这个计数器变为0为止。 当然了,如果CountDownLatch里面的值设的和线程的不一样,或者设置大了,可能会导致主线程一直阻塞在这里。