CountDownLatch可以让一个或多个任务进行等待,在其他一组任务完成之后再执行。CountDownLatch被设计为只触发一次,计数器不能被重置,CyclicBarrier可以进行重置。
public class TaskPortion implements Runnable{
private static int counter = 0;
private final int id = counter++;
private static Random rand = new Random(47);
private final CountDownLatch latch;
public TaskPortion(CountDownLatch latch){
this.latch = latch;
}
@Override
public void run() {
try {
doWork();
latch.countDown();
} catch (Exception e) {
// TODO: handle exception
}
}
public void doWork() throws InterruptedException{
TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));
System.out.println(this+"completed");
}
public String toString(){
return String.format("%1$-3d", id);
}
}
public class WaitingTask implements Runnable {
private static int counter = 0;
private final int id = counter++;
private final CountDownLatch latch;
public WaitingTask(CountDownLatch latch){
this.latch = latch;
}
@Override
public void run() {
try {
latch.await();
System.out.println("latch barrier passed for "+this);
} catch (Exception e) {
// TODO: handle exception
}
}
public void doWork() throws InterruptedException{
System.out.println(this+"completed");
}
public String toString(){
return String.format("Waitingtask %1$-3d", id);
}
}
public class CountDownLatchDemo {
static final int SIZE = 100;
/**
* @param args
*/
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
CountDownLatch latch = new CountDownLatch(SIZE);
for(int i=0;i<10;i++){
executorService.execute(new WaitingTask(latch));
}
for(int i=0;i<SIZE;i++){
executorService.execute(new TaskPortion(latch));
}
System.out.println("launched all tasks");
executorService.shutdown();
}
}
输出结果:
launched all tasks
11 completed
7 completed
9 completed
10 completed
5 completed
8 completed
12 completed
1 completed
13 completed
2 completed
14 completed
17 completed
6 completed
4 completed
0 completed
19 completed
15 completed
18 completed
3 completed
16 completed
latch barrier passed for Waitingtask 1
latch barrier passed for Waitingtask 0
latch barrier passed for Waitingtask 2
latch barrier passed for Waitingtask 3
latch barrier passed for Waitingtask 4
latch barrier passed for Waitingtask 5
latch barrier passed for Waitingtask 6
latch barrier passed for Waitingtask 7
latch barrier passed for Waitingtask 8
latch barrier passed for Waitingtask 9