java并发编程专题(八)----(JUC)实例讲解CountDownLatch
CountDownLatch是一个非常实用的多线程控制工具类。”CountDown”在英文中意为倒计数,Latch为门问的意思。如果翻译成为倒计数门阀,我想大家都会觉得不知所云吧!因此,这里简单地称之为倒计数器。在这里,门问的含义是:把门锁起来,不让里面的线程跑出来。因此,这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计时结束,再开始执行。
CountDownLatch的构造函数接收一个整数作为参数,即当前这个计数器的计数个数。
publicCountDownLatch(intcount)
CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。一个CountDownLatch初始化为给定的计数。调用await方法阻塞,直到当前计数为零,在调用countDown()方法之后,所有等待的线程被释放,任何后续调用await立即返回。这是一次性的现象-计数不能重置。如果需要重置计数,考虑使用CyclicBarrier,CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。
主要方法:
//使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。 voidawait() //使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。 booleanawait(longtimeout,TimeUnitunit) //递减锁存器的计数,如果计数到达零,则释放所有等待的线程。 voidcountDown() //返回当前计数。 longgetCount()
我们来看一个例子:
publicclassTestCountDownLatch{ privatestaticfinalintRUNNER_NUMBER=5;//运动员个数 privatestaticfinalRandomRANDOM=newRandom(); publicstaticvoidmain(String[]args){ //用于判断发令之前运动员是否已经完全进入准备状态,需要等待5个运动员,所以参数为5 CountDownLatchreadyLatch=newCountDownLatch(RUNNER_NUMBER); //用于判断裁判是否已经发令,只需要等待一个裁判,所以参数为1 CountDownLatchstartLatch=newCountDownLatch(1); for(inti=0;i打印结果:
1号运动员:我需要547秒时间准备.
2号运动员:我需要281秒时间准备.
4号运动员:我需要563秒时间准备.
5号运动员:我需要916秒时间准备.
3号运动员:我需要461秒时间准备.
2号运动员:我已经准备完毕.
3号运动员:我已经准备完毕.
1号运动员:我已经准备完毕.
4号运动员:我已经准备完毕.
5号运动员:我已经准备完毕.
裁判:所有运动员准备完毕,开始...
3号运动员:开跑...
2号运动员:开跑...
1号运动员:开跑...
4号运动员:开跑...
5号运动员:开跑...Processfinishedwithexitcode0
注意:计数器必须大于等于0,只是等于0时候,计数器就是零,调用await方法时不会阻塞当前线程。
以上就是java并发编程专题(八)----(JUC)实例讲解CountDownLatch的详细内容,更多关于javajucCountDownLatch的资料请关注毛票票其它相关文章!