CountDownLatch倒计时器
CountDownLatch是⼀个多线程控制⼯具。⽤来控制线程的等待。设置需要countDown的数量num,然后每⼀个线程执⾏完毕后,调⽤countDown()⽅法,⽽主线程调⽤await()⽅法执⾏等待,直到num个⼦线程执⾏了countDown()⽅法 ,则主线程开始继续执⾏。
![](https://img-blog.csdnimg.cn/b5715d5a26c04bbe9eded116b57425dd.png)
CyclicBarrier循环栅栏
CyclicBarrier.await()⽅法可能会
抛出两种异常
:⼀个是
InterruptedException
,也就是在等待过程中,线程被中断,应该说这是⼀个⾮常通⽤的异常,⼤部分迫使线程等待的⽅法都可能会抛出这个异常,使得线程在等待时依然可以响应外部紧急事件。另外⼀个异常则是CyclicBarrier特有的
BrokenBarrierException
,⼀旦遇到这个异常,则表示当前的CyclicBarrier已经破损了,可能系统已经没有办法等待所有线程到⻬了。如果继续等待,可能就是徒劳⽆功的,因此就此结束吧。
LockSupport线程阻塞⼯具类
- LockSupport是⼀个⾮常⽅便实⽤的线程阻塞⼯具,它可以在线程内任意位置让线程阻塞。和Thread.suspend()相⽐,它弥补了由于resume()在前发⽣,导致线程⽆法继续执⾏的情况。和Object.wait()⽅法相⽐,它不需要先获得某个对象的锁,也不会抛出InterruptedException异常。
- park()可以阻塞当前线程,其中每⼀个线程都有⼀个许可,该许可默认为[不可⽤]。如果该许可是[可⽤]状态,那么park()⽅法会⽴即返回,消费这个许可,将该许可变更为[不可⽤]状态,流程代码可以继续执⾏。如果该许可是[不可⽤]状态,那么park()⽅法将会阻塞;unpark⽅法,将指定线程的⼀个许可变为[可⽤]状态。如下表所示:
示例⼀:先执⾏unpark()⽅法再执⾏park()⽅法,也不会造成永久卡死线程。如下所示:
示例⼆:LockSupport.park()还能⽀持中断。但是它不会抛InterruptedException异常。它只会默默的返回,但是我们可以从Thread.interrupted()等⽅法获得中断标记。