CountDownLatch是减计数方式,计数==0时释放所有等待的线程;CountDownLatch当计数到0时,计数无法被重置;CountDownLatch每次调用countDown()方法计数减一,调用await()方法只进行阻塞,对计数没任何影响;
代码:
package Concurrent;
import java.util.concurrent.CountDownLatch;
/**
*
* @author zhengchao
*/
public class CountDownLatchTest extends Thread{
@Override
public void run() {
System.out.println("&&&&&&");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
latch.countDown();
}
/**
* CountDownLatch 是并发包中提供的一个可用于控制多个线程同时开始某个动作的类,
* 其采用的方式为减计数的方式,每次调用countDown()方法计数减一,
* 当计数减至零时位于latch.await()后的代码才会被执行。
*/
private static CountDownLatch latch = new CountDownLatch(10);
public static void main(String[] args) {
long start = System.currentTimeMillis();
int i = 0;
while (i < 10) {
i++;
new CountDownLatchTest().start();
}
try {
latch.await();
} catch (InterruptedException e) {
}
System.out.println("use time:" + (System.currentTimeMillis() - start));
}
}
运行结果:
run:
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
use time:101
成功构建 (总时间: 0 秒)
如果不用此对象,运行结果如下:
run:
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
&&&&&&
use time:1
&&&&&&
每次运行结果不一定一致,从运行结果可知,use time:1在所有线程执行完之前输出了。
CyclicBarrier是加计数方式,计数达到构造方法中参数指定的值时释放所有等待的线程。CyclicBarrier计数达到指定值时,计数置为0重新开始。CyclicBarrier只有一个await()方法,调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞。
package Concurrent;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
*
* @author zhengchao
*/
public class CylicBarrierTest extends Thread{
/**
* CyclicBarrier 和CountDownLatch不同,CyclicBarrier是当await 的数量达到了设置的数量后,
* 才继续往下执行
*/
static CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
private int id;
public CylicBarrierTest(int id) {
this.id = id;
}
public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
int i = 0;
while (i < 4) {
i++;
new CylicBarrierTest(i).start();
}
cyclicBarrier.await();
System.out.println("我去,终于到我了!");
}
public void run() {
try {
System.out.println("#########" + id);
cyclicBarrier.await();
System.out.println("*********:" + id);
} catch (InterruptedException e1) {
} catch (BrokenBarrierException e) {
}
}
}
运行结果:
run:
#########1
#########4
#########3
#########2
*********:2
我去,终于到我了!
*********:4
*********:1
*********:3
成功构建 (总时间: 0 秒)