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塊磚,大家辛苦了。

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