1、CountDownLatch的解释 http://www.importnew.com/15731.html
在jdk1.5出现的类,它能够使一个线程等待其它线程完成工作后再执行,换句话说,就是一个线程执行的前提是某些线程必须执行完毕,此时就可以使用CountDownLatch。
CountDownLatch通过一个计数器实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,便调用countDown()方法,将计数器的值减1。当计数器的值减为0时,表示所有的线程已经执行完,此时在闭锁上等待的线程可以恢复执行任务。
2、CountDownLatch的应用
实现最大程度的并行性:在想要同时启动多个线程时,可以将CountDownLatch的计数器设置为1,多个线程同时等待await(),然后将计数器减1,这样可以做到多个线程最大程度的并行执行。
等待某些任务的完成
3、CyclicBarrier的解释
同步屏障,它的作用是让一组线程都到达就绪状态,同时争抢执行权,达到线程之间竞争公平的目的。
在初始化时,指定线程数,每当一个线程就绪后,调用一次await()方法,将线程数减1,当线程数减至0时,以等待的线程同时抢夺执行。
注意,等待中的线程因某个原因被释放时,其它等待的线程也会被释放
下列条件满足可以使得等待中的线程被释放继续执行:
最后一个线程到达;
当前线程被其它线程打断;
其它等待的线程被打断;
其它线程等待的线程因超时而被释放;
外部线程重置了计数器,CyclicBarrier.reset()
支持一个栅栏行动,就是一个Runnable实例,在栅栏被打开时,该Runnable也会被执行。
4、CountDownLatch 和CyclicBarrier的不同之处?
CountDownLatch只能使用一次。而CyclicBarrier可以使用多次,通过reset将计数器的值重置为初始值;
CyclicBarrier还有其它方法,例如getNumberWaiting()可以获得阻塞的线程数,isBroken()可以获得阻塞的方法是否被中断
5、Semaphore - 信号量
信号量的值表示允许最多同时只能有该值个线程执行。每有一个线程执行调用一次acquire()方法,就表示可执行线程数减1;每有一个线程结束执行,调用一次release()方法,就表示可执行线程数加1。
6、Semaphore的用法
保护一个重要的代码,防止过多的线程进入。即线程执行前先获得“许可”;
在两个线程之间进行通信,一个线程调用acquire(),另一个线程调用release()
7、Exchanger - 交换机
可以实现两个线程之间数据的交换,它提供一个同步点,在这个点上,两个线程可以通过exchanger()方法进行交换数据,并且先到达的线程调用该方法后,会等待另一个线程到达。