CountDownLatch的使用
1.概述
CountDownLatch就是一个或者一组线程在开始执行操作之前,必须要等到其他线程执行完才可以。我们举一个例子来说明,在考试的时候,老师必须要等到所有人交了试卷才可以走。此时老师就相当于等待线程,而学生就好比是执行的线程。
注意:java中还有一个同步工具类叫做CyclicBarrier,他的作用和CountDownLatch类似。同样是等待其他线程都完成了,才可以进行下一步操作,我们再举一个例子,在打王者的时候,在开局前所有人都必须要加载到100%才可以进入。否则所有玩家都相互等待。
我们看一下区别:
CountDownLatch: 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。 CyclicBarrier : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。关键点其实就在于那N个线程(1)CountDownLatch里面N个线程就是学生,学生做完了试卷就可以走了,不用等待其他的学生是否完成(2)CyclicBarrier 里面N个线程就是所有的游戏玩家,一个游戏玩家加载到100%还不可以,必须要等到其他的游戏玩家都加载到100%才可以开局
2.简单使用
//指定人数 CountDownLatch countDownLatch = new CountDownLatch(2); new Thread(){ @Override public void run() { super.run(); System.out.println("第一个人交卷"); //countDownLatch的count减一 countDownLatch.countDown(); } }.start(); try { //等待时间 如果countDownLatch的count=0 返回true 否则返回false 这里处于阻塞状态 boolean await = countDownLatch.await(10, TimeUnit.SECONDS); System.out.println(await); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("考试结束");