CountDownLatch用法
来源:互联网 发布:tag标签自动获取seo 编辑:程序博客网 时间:2024/06/05 16:34
CountDownLatch被用来同步一个或多个任务,强制它们等待由其它任务执行的一组操作完成。
构造方法CountDownLatch(int count)
构造一个用给定计数初始化的CountDownLatch
。
任何在这个对象上调用await()的方法将会被阻塞,直至这个技术值为0。其他任务在结束其工作时,可以在该对象上调用countDown()来减小这个计数值。CountDownLatch被设计为只触发一次,计数值不能被重置。如果需要重置计数值的版本,则可以调用CyclicBarrier。调用countDown()的任务在产生这个调用时并没有被阻塞,只有对await()的调用会被阻塞,直至计数值到达0。CountDownLatch的典型用法是将一个程序分为n个互相独立的可解决任务,并创建值为n的CountDownLatch。当每个任务完成时,都会在锁存器上调用countDown()。等待问题被解决的任务在这个锁存器上调用await(),将它们自己拦住,直至锁存器计数结束。
示例:
package thread;import java.util.Random;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class CountDownLatchDemo {static final int SIZE = 100;public static void main(String[] args) {ExecutorService exec = Executors.newCachedThreadPool();CountDownLatch latch = new CountDownLatch(100);for(int i=0;i<10;i++)exec.execute(new WaitingTask(latch));for(int i=0;i<SIZE;i++)exec.execute(new TaskPortion(latch));System.out.println("Launched all tasks");exec.shutdown();}}class WaitingTask implements Runnable{private static int counter = 0;private final int id = counter++;private final CountDownLatch latch;WaitingTask(CountDownLatch latch){this.latch = latch;}@Overridepublic void run() {try {//该任务等待latch.await();System.out.println("Latch barrier passed for "+latch);} catch (InterruptedException e) {System.out.println(this+" interrupted");}}public String toString(){return String.format("WaitingTask %1$-3d", id);}}class TaskPortion implements Runnable{private static int counter = 0;private final int id = counter++;private static Random rand = new Random(47);private final CountDownLatch latch;public TaskPortion(CountDownLatch latch){this.latch = latch;}@Overridepublic void run() {try{doWork();//每次完成一个任务,调用countDown使计数值减一latch.countDown();}catch(Exception e){}}public void doWork() throws Exception{TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));System.out.println(this+" completed");}public String toString(){return String.format("%1$-3d", id);}}输出:
Launched all tasks37 completed45 completed99 completed95 completed94 completed11 completed23 completed77 completed7 completed9 completed75 completed10 completed79 completed39 completed25 completed36 completed96 completed63 completed30 completed40 completed55 completed90 completed28 completed88 completed6 completed50 completed8 completed12 completed0 completed27 completed13 completed98 completed72 completed71 completed2 completed43 completed35 completed15 completed91 completed18 completed5 completed33 completed97 completed21 completed69 completed34 completed4 completed68 completed38 completed48 completed87 completed70 completed84 completed86 completed66 completed54 completed42 completed29 completed46 completed74 completed57 completed1 completed20 completed65 completed80 completed16 completed60 completed89 completed14 completed51 completed53 completed62 completed58 completed76 completed92 completed22 completed19 completed56 completed85 completed61 completed31 completed26 completed24 completed59 completed67 completed47 completed41 completed32 completed3 completed52 completed93 completed81 completed78 completed73 completed44 completed49 completed17 completed82 completed64 completed83 completedLatch barrier passed for java.util.concurrent.CountDownLatch@189e7143[Count = 0]Latch barrier passed for java.util.concurrent.CountDownLatch@189e7143[Count = 0]Latch barrier passed for java.util.concurrent.CountDownLatch@189e7143[Count = 0]Latch barrier passed for java.util.concurrent.CountDownLatch@189e7143[Count = 0]Latch barrier passed for java.util.concurrent.CountDownLatch@189e7143[Count = 0]Latch barrier passed for java.util.concurrent.CountDownLatch@189e7143[Count = 0]Latch barrier passed for java.util.concurrent.CountDownLatch@189e7143[Count = 0]Latch barrier passed for java.util.concurrent.CountDownLatch@189e7143[Count = 0]Latch barrier passed for java.util.concurrent.CountDownLatch@189e7143[Count = 0]Latch barrier passed for java.util.concurrent.CountDownLatch@189e7143[Count = 0]
从中可以看出WaitingTask最后执行,count=0;
0 0
- CountDownLatch用法
- CountDownLatch用法
- CountDownLatch用法
- CountDownLatch用法
- CountDownLatch 用法
- CountDownLatch用法
- CountDownLatch用法
- CountDownLatch用法
- CountDownLatch用法
- java 多线程 CountDownLatch用法
- 多线程CountDownLatch用法
- java 多线程 CountDownLatch用法
- java 多线程 CountDownLatch用法
- java 多线程 CountDownLatch用法
- java 多线程 CountDownLatch用法
- java 多线程 CountDownLatch用法
- java 多线程 CountDownLatch用法
- java 多线程 CountDownLatch用法
- 1、Oracle专家编程--安装SCOTT/TIGER模式
- 开源项目DataBaseManager(一):想法
- linux下安装yum命令安装lamp环境
- 基于Smack3.0.4+ Openfire3.10.2下学习开发IM(二)用户分组信息(Roster、RosterGroup和RosterEntry)
- 图片和base64 String互转
- CountDownLatch用法
- Go 语言 make & new
- 第三方框架AFN使用
- Single-instance applications
- 软件包管理
- coderforce 534A Exam
- 浮动IP(Floating IPs):开始构建你的高可用性的应用
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- 白话浅析DDD