JAVA 线程等待

来源:互联网 发布:java怎么实现导出word 编辑:程序博客网 时间:2024/05/21 22:24

CyclicBarrier只要有一个线程没完成,所有线程等待

CountDownLatch监听线程操作(比如初始化),等待操作完成之后,通知其他线程

Created with Raphaël 2.1.0主线程主线程CountDownLatch对象CountDownLatch对象子线程子线程子线程子线程主线程主线程1.创建CountDownLatch(1)对象,计数为12.创建一个子线程,长时间操作计算结果3.cutDown()使CountDownLatch对象计数为0,通知主线程4.主线程接到通知和结果,继续运行
//应用public class Main {    public static void main(String[] args) throws Exception{        Map cm =new HashMap();         ExecutorService executor = Executors.newCachedThreadPool();        CountDownLatch latch = new CountDownLatch(3);        Worker w1 = new Worker(latch, "张三",cm);        Worker w2 = new Worker(latch, "李四",cm);        Worker w3 = new Worker(latch, "王二",cm);        executor.execute(w3);        executor.execute(w2);        executor.execute(w1);        System.out.println("老板正在监工......");        try {            latch.await();        } catch (InterruptedException e) {        }        System.out.println("结束,老板开始检查了!");        System.out.println("一共搬了"+cm.get("z")+"块砖,大家辛苦了。");        executor.shutdown();    }}//对象public class Worker implements Runnable {    private CountDownLatch downLatch;    private String name;    private Map workedJobs;    private int jobs;    public Worker(CountDownLatch downLatch, String name,Map workedJobs) {        this.downLatch = downLatch;        this.name = name;        this.workedJobs = workedJobs;    }    public void run() {        this.doWork();        try {            TimeUnit.SECONDS.sleep(new Random().nextInt(3));        } catch (InterruptedException ie) {}        Integer wj = (Integer)workedJobs.get("z");        int sum = (wj==null?0:wj);        workedJobs.put("z", sum +=jobs);        System.out.println("--------- "+ this.name + "活干完了!");        this.downLatch.countDown();//通知我做完了    }    private void doWork() {        jobs=new Random().nextInt(10);        System.out.println(this.name + " ,搬了"+jobs+"块砖!");    }}

结果:
老板正在监工……
李四 ,搬了5块砖!
王二 ,搬了5块砖!
张三 ,搬了7块砖!
——— 王二活干完了!
——— 李四活干完了!
——— 张三活干完了!
结束,老板开始检查了!

一共搬了17块砖,大家辛苦了。

0 0