CountDownLatch 倒计数使用,减到0触发 让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。 CountDownLatch主要有两个方法。一个是await(),一个是countDown(). 当一个线程或多个线程调用await方法时,调用的线程会被阻塞。其他线程调用countDown时会将计数器减1,调用countDown 方法 的线程不会阻塞。当计数器的值变为0时,因调用await方法被阻塞的线程会被唤醒。
CyclicBarrier 加到特定的值触发 字面的意思屏障。但是他比CountDownLatch有的优点时可以重复使用。通过重制特定的值。重复触发。但是CountDownLatch是一次性的。 让一组线程达到一个屏障时会被阻塞,直到最后一个线程达到屏障时,屏障才会打开。所有的拦截线程才可以继续干活。线程进入屏障是通过await方法。
CountDownLatch和CyclicBarrier都是JUC下的多线程工具类。 CountDownLatch中的countDown方法在线程继续之后,可以继续执行自己的任务,而CyclicBarrier会在所有的线程结束之后才会进行后续的工作任务。
Semaphore 信号灯 Semaphore可以控制同时访问的线程个数,通过acquire方法获取一个许可,如果没有就等待,而release方法释放一个许可。
小结:CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只是CountDownLatch一般用于一个线程等其它的线程都执行之后才开始执行。CyclicBarrier一般是等待所有的线程达到某个状态后,大家再一起开始执行。类似有点像参加比赛。等人到齐了,再开始。 Semaphore类似有点像锁,一般用来控制某些资源的访问权限。