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
原创粉丝点击