并发编程 - CoundDownLatch

CoundDownLatch 倒计数器

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

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

/**
 * 模块:【倒计数器】
 * 

* 开发: 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 高并发程序设计》这本书。

你可能感兴趣的:(并发编程 - CoundDownLatch)