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 !

 

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