Java併發程式設計之——CountDownLatch的使用
阿新 • • 發佈:2019-02-07
最近在開發Android專案的時候有一個需求:在Service中開啟多個執行緒併發的執行任務,當這三個執行緒執行完畢之後,主執行緒才能繼續往下執行。剛開始使用的是AsyncTask+AtomicInteger的方式,然後在onpostexecute回撥中對AtomicInteger進行自增且判斷其值是否達到了要求的值,如果達到了要求的值就繼續執行相應的操作,否則跳過。但是發現這種方式並不能很好的實現想要的效果!於是研究了下Java併發程式設計中的CountDownLatch使用。
CountDownLatch位於包java.util.concurrent下面,它的應用場景是:有一個任務,需要等待其他幾個任務完成之後才能繼續執行,這個時候就可以使用CountDownLatch了。
CountDownLatch有一個構造器,count代表計數值,也就是任務的個數。
- public CountDownLatch(int count) {
- if (count <0) throw new IllegalArgumentException("count <0");
- this.sync = new Sync(count);
- }
- publicvoid await() throws InterruptedException {} //呼叫await執行緒會被掛起,直到count計數值為0才繼續執行
- publicboolean await(
- publicvoid countDown() { }//count計數值減一
- package com.easyliu.java.demo;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- publicclass CountDownLatchTest {
- privatestatic CountDownLatch sCountDownLatch = null;
- privatestaticfinalint THREAD_NUMBER = 3;
- /**
- * @param args
- */
- publicstaticvoid main(String[] args) {
- sCountDownLatch = new CountDownLatch(THREAD_NUMBER);
- //執行緒池
- ExecutorService fixedThreadPool = Executors
- .newFixedThreadPool(THREAD_NUMBER);
- //執行執行緒
- fixedThreadPool.execute(new ConsumeRunnable("one"));
- fixedThreadPool.execute(new ConsumeRunnable("two"));
- fixedThreadPool.execute(new ConsumeRunnable("three"));
- System.out.println("等待3個子執行緒執行完畢...");
- try {
- sCountDownLatch.await();
- System.out.println("3個子執行緒已經執行完畢");
- System.out.println("繼續執行主執行緒");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- privatestaticclass ConsumeRunnable implements Runnable {
- private String mName;
- public ConsumeRunnable(String name) {
- this.mName = name;
- }
- publicvoid run() {
- System.out.println("子執行緒" + mName + "正在執行");
- try {
- Thread.sleep(3000);// 模擬耗時操作
- System.out.println("子執行緒" + mName + "執行完畢");
- sCountDownLatch.countDown();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
輸入如下所示:
- 等待3個子執行緒執行完畢...
- 子執行緒two正在執行
- 子執行緒one正在執行
- 子執行緒three正在執行
- 子執行緒one執行完畢
- 子執行緒three執行完畢
- 子執行緒two執行完畢
- 3個子執行緒已經執行完畢
- 繼續執行主執行緒
轉載於:https://blog.csdn.net/liuyi1207164339/article/details/51597408