并发编程 - CoundDownLatch

2018-09-03  本文已影响0人  52HzBoo

CoundDownLatch 倒计数器

CoundDownLatch 多线程执行,比如控制让其余5个线程执行完毕
再继续执行自身剩余业务。

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

/**
 * 模块:【倒计数器】
 * <p>
 * 开发: Bruce.Liu By 2018/8/23 下午9:19 Create
 */
public class CountDownLatchDemo implements Runnable {

    static final CountDownLatch end = new CountDownLatch(10);
    static final CountDownLatchDemo demo = new CountDownLatchDemo();

    @Override
    public void run() {
        try {
            Integer rdm = new Random().nextInt(10)*1000;
            //System.err.println(Thread.currentThread().getName()+" 暂停时间:"+rdm);
            Thread.sleep(rdm);//随机暂停
            System.err.println(Thread.currentThread().getName()+" 线程已经执行完毕 ");
            end.countDown();//标示当前线程已经执行完毕
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService ex = Executors.newFixedThreadPool(10);
        for(int i = 0 ; i < 10 ; i ++){
            ex.submit(demo);
        }
        System.err.println("Main异步开始进入等待");
        end.await();//等待
        System.err.println("CountDownLatch 已全部执行完毕 !");
        ex.shutdown();
        System.err.println("测试线程池执行完毕 !");
    }

}

执行结果 例:

Main异步开始进入等待
pool-1-thread-10 线程已经执行完毕
pool-1-thread-7 线程已经执行完毕
pool-1-thread-5 线程已经执行完毕
pool-1-thread-9 线程已经执行完毕
pool-1-thread-8 线程已经执行完毕
pool-1-thread-1 线程已经执行完毕
pool-1-thread-4 线程已经执行完毕
pool-1-thread-3 线程已经执行完毕
pool-1-thread-2 线程已经执行完毕
pool-1-thread-6 线程已经执行完毕
CountDownLatch 已全部执行完毕 !
测试线程池执行完毕 !

代码解读

A. main函数创建了一个线程池为10的对象,
循环执行10次CountDownLatchDemo demo对象
B. main执行end.await();main主线程被临时挂起,等待10个线程执行完毕。
C. 线程执行end.countDown();标示当前线程已经执行完毕
D. 当全部线程执行完毕后,main继续执行剩余的业务代码

参考:《实战 Java 高并发程序设计》这本书。

上一篇下一篇

猜你喜欢

热点阅读