JAVA 线程等待

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块砖,大家辛苦了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章