java编程思想-CountDownLatch
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;}@Overridepublic 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;}@Overridepublic 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();}}
页:
[1]