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