Java多线程-CountDownLatch用法
CountDownLatch 可以立即看作一個(gè)計(jì)數(shù)器,不過計(jì)數(shù)是原子操作,也就是說同一時(shí)間只有一個(gè)線程能夠操作該計(jì)數(shù)器;
我們先看看該類常用的幾個(gè)方法:
你可以給它設(shè)定一個(gè)數(shù)目,調(diào)用該類await方法會(huì)使調(diào)用await的方法的線程處于等待狀態(tài);直到該計(jì)數(shù)器計(jì)數(shù)為0;由此特性,我們可以將它用于一下場(chǎng)景:
場(chǎng)景:只有把所有的任務(wù)執(zhí)行完畢后才執(zhí)行另外一個(gè)任務(wù)
下面演示是當(dāng)把三個(gè)WorkTask任務(wù)都執(zhí)行完畢后才執(zhí)行AllTaskDonedTask任務(wù)
public class Test{public static void main(String[] args) {int taskSize = 3;//創(chuàng)建一個(gè)計(jì)數(shù)器,并對(duì)其初始化final CountDownLatch doneSingle = new CountDownLatch(taskSize);//創(chuàng)建一個(gè)固定線程池,此處線程池的線程數(shù)目和taskSize無直接關(guān)Executor executor = Executors.newFixedThreadPool(taskSize);//執(zhí)行所有任務(wù)for (int i = 0; i < taskSize; i++) {executor.execute(new WorkTask(doneSingle));}executor.execute(new AllTaskDonedTask(countDownLatch));}static class WorkTask implements Runnable {CountDownLatch mCountDownLatch;public WorkTask(CountDownLatch countDownLatch) {mCountDownLatch = countDownLatch;}@Overridepublic void run() {try {println(Thread.currentThread().getName()+" execute task....");Thread.sleep(1000);//模擬耗時(shí)操作mCountDownLatch.countDown();//任務(wù)執(zhí)行完畢計(jì)數(shù)器減1} catch (InterruptedException e) {e.printStackTrace();}}}//所有任務(wù)執(zhí)行完畢后需要執(zhí)行的任務(wù)static class AllTaskDonedTask implements Runnable {CountDownLatch mCountDownLatch;public AllTaskDonedTask(CountDownLatch countDownLatch) {mCountDownLatch = countDownLatch;}@Overridepublic void run() {try {mCountDownLatch.await();//此處會(huì)使當(dāng)前線程處于等待狀態(tài),直到3個(gè)WorkTask全部執(zhí)行完畢,才會(huì)繼續(xù)執(zhí)行下面println("所有任務(wù)執(zhí)行完畢我才執(zhí)行");} catch (InterruptedException e) {e.printStackTrace();}}}}執(zhí)行結(jié)果:
pool-1-thread-3 execute task.... pool-1-thread-1 execute task.... pool-1-thread-2 execute task.... 所有任務(wù)執(zhí)行完畢我才執(zhí)行從上面代碼我們不難看出,我們?cè)趫?zhí)行WorkTask任務(wù)結(jié)束時(shí)都需要對(duì)計(jì)數(shù)器減1;在AllTaskDonedTask任務(wù)執(zhí)行前需要調(diào)用CountDownLatch.await()方法,這樣當(dāng)前線程會(huì)處于等待狀態(tài),直到計(jì)數(shù)器減為0時(shí)也即WorkTask任務(wù)都執(zhí)行完畢后,AllTaskDonedTask方可執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的Java多线程-CountDownLatch用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android-源码解析HandlerL
- 下一篇: Android-完美解决在Activit