thinking in java的代码,关于CountDownLatch的部分。CountDownLatch实例化的时候在构造函数中会填写一个数字SIZE(计数器) ,通过调用countDown(),每次会将计数器减1,直到等于0,这个时候,才会改变await的阻塞状态。
SIZE等于1,可以模拟开关,等于N可以模拟执行某一个步骤前的N个步骤。
代码1:
package com.cakushin.thread.countdownlatch;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
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 (InterruptedException e) {
e.printStackTrace();
}
}
private void doWork() throws InterruptedException {
Thread.sleep(rand.nextInt(2000));
System.out.println(this + " completed!");
}
public String toString(){
return String.format("%1$-3d", id);
}
}
代码2:
package com.cakushin.thread.countdownlatch;
import java.util.concurrent.CountDownLatch;
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 (InterruptedException e) {
System.out.println(this + " interrupted");
}
}
public String toString(){
return String.format("WatingTask %1$-3d", id);
}
}
代码3:
package com.cakushin.thread.countdownlatch;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public final class CountDownLatchDemo {
static final int SIZE = 100;
/**
* @author Administrator
* @param args
*/
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
CountDownLatch latch = new CountDownLatch(SIZE);
for(int i = 0; i < 10; i++){
exec.execute(new WaitingTask(latch));
}
for(int i = 0; i < 100; i++){
exec.execute(new TaskPortion(latch));
}
System.out.println("Launched all tasks");
exec.shutdown();
}
}