CountDownLatch 倒數計數器

即當前線程,等待CountDownLatch中的各子線程任務都完成後,在繼續往下執行的任務

下述demo新建一個倒數計數器10。

每個線程計數器調用countDownLatch.countDown();倒計數一次。

 

主方法裏,使用線程池分發了十個線程做子任務,並調用countDownLatch.await();方法等待倒計數完成。

等十個子線程都完成後,倒計數爲0,則主線程await()方法後的代碼才執行。

 

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @Author:minglu
 * @Description:
 * @Date: 2018/11/27
 */
public class CountDownLatchDemo implements Runnable {
    static final CountDownLatch countDownLatch = new CountDownLatch(10);
    static final CountDownLatchDemo demo = new CountDownLatchDemo();
    @Override
    public void run() {
        try{
            //模擬檢查任務
            Thread.sleep(new Random().nextInt(10)*1000);
            countDownLatch.countDown();
            System.out.println("sub Check complete! rest sub check number:"+countDownLatch.getCount());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            service.submit(demo);
        }
        //等待十個檢查任務完成
        countDownLatch.await();
        //
        System.out.println("all check complete ! fire !");
        service.shutdown();
    }
}

運行結果

sub Check complete! rest sub check number:9
sub Check complete! rest sub check number:8
sub Check complete! rest sub check number:7
sub Check complete! rest sub check number:6
sub Check complete! rest sub check number:5
sub Check complete! rest sub check number:4
sub Check complete! rest sub check number:3
sub Check complete! rest sub check number:2
sub Check complete! rest sub check number:1
sub Check complete! rest sub check number:0
all check complete ! fire !

 

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