1. 程式人生 > >併發程式設計-concurrent指南-計數器CountDownLatch

併發程式設計-concurrent指南-計數器CountDownLatch

java.util.concurrent.CountDownLatch 是一個併發構造,它允許一個或多個執行緒等待一系列指定操作的完成。

CountDownLatch 以一個給定的數量初始化。countDown() 每被呼叫一次,這一數量就減一。通過呼叫 await() 方法之一,執行緒可以阻塞等待這一數量到達零。

利用它可以實現類似計數器的功能。

比如有一個任務A,它要等待其他5個任務執行完畢之後才能執行,此時就可以利用CountDownLatch來實現這種功能了。

舉個例子:

有五個工人在為老闆幹活,這個老闆有一個習慣,就是當五個工人把一天的活都幹完了的時候,他就來檢查所有工人所幹的活。記住這個條件:五個工人先全部幹完活,老闆才檢查。所以在這裡用Java程式碼設計兩個類,Worker代表工人,Boss代表老闆

import java.util.concurrent.CountDownLatch;

public class Main {
    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(5);//五個工人

        //工人
        Worker worker1 = new Worker(countDownLatch);
        new Thread(worker1).start();
        Worker worker2 
= new Worker(countDownLatch); new Thread(worker2).start(); Worker worker3 = new Worker(countDownLatch); new Thread(worker3).start(); Worker worker4= new Worker(countDownLatch); new Thread(worker4).start(); Worker worker5 = new Worker(countDownLatch);
new Thread(worker5).start(); //老闆 Boss boss = new Boss(countDownLatch); new Thread(boss).start(); } }
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * 工人
 */
public class Worker implements Runnable{
    private CountDownLatch countDownLatch;
    public Worker(CountDownLatch countDownLatch){
        this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+",工人在幹活。。。");
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+",工人幹活結束。。。");
        countDownLatch.countDown();
    }
}
import java.util.concurrent.CountDownLatch;

/**
 * 老闆
 */
public class Boss implements Runnable{
    private CountDownLatch countDownLatch;
    public Boss(CountDownLatch countDownLatch){
        this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
        System.out.println("老闆等待所有工人幹活完成。。");
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("所有工人幹活完成,開始檢查。。");
    }
}

結果:

Thread-0,工人在幹活。。。
Thread-1,工人在幹活。。。
Thread-3,工人在幹活。。。
Thread-2,工人在幹活。。。
Thread-4,工人在幹活。。。
老闆等待所有工人幹活完成。。
Thread-2,工人幹活結束。。。
Thread-3,工人幹活結束。。。
Thread-1,工人幹活結束。。。
Thread-4,工人幹活結束。。。
Thread-0,工人幹活結束。。。
所有工人幹活完成,開始檢查。。

 

 

原始碼地址:https://github.com/qjm201000/concurrent_countDownLatch.git