一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
实例代码:
package thread;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class TaskPortion implements Runnable {
private static int counter = 0;
private final int id = ++counter;
private final CountDownLatch latch;
private static Random random = new Random(47);
public TaskPortion(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
try {
doWork();
latch.countDown();
} catch (InterruptedException e) {
System.out.println(this + " Interrupt !");
}
}
public void doWork() throws InterruptedException {
TimeUnit.MICROSECONDS.sleep(random.nextInt(2000));
System.out.println(this + "Completed ! ");
}
@Override
public String toString() {
return String.format("%1$-3d ", id);
}
}
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("所有的任务都完成啦!");
} catch (InterruptedException e) {
System.out.println(this + " Interrupt !");
}
}
@Override
public String toString() {
return String.format("WaitingTask %1$-3d ", id);
}
}
public class CountDownLatchDemo {
static final int SIZE = 100;
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
CountDownLatch latch = new CountDownLatch(SIZE);
for(int i=0; i<3; i++) {
exec.execute(new WaitingTask(latch));
}
for(int i=0; i<SIZE; i++) {
exec.execute(new TaskPortion(latch));
}
System.out.println("任务分配完成!");
exec.shutdown();
}
}