java CountDownLatch使用

来源:互联网 发布:数据分析平台需求文档 编辑:程序博客网 时间:2024/06/06 07:48

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 tasks11 completed7  completed9  completed10 completed5  completed8  completed12 completed1  completed13 completed2  completed14 completed17 completed6  completed4  completed0  completed19 completed15 completed18 completed3  completed16 completedlatch 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  
0 0
原创粉丝点击