1. 程式人生 > >Android中CountDownLatch實現多執行緒同步

Android中CountDownLatch實現多執行緒同步

簡介

CountDownLatch 通過它的名字也能猜出一二來,Countdown 顧名思義倒計時,Latch可以理解為觸發或者發射。也就是說當倒數到0時就可以發射火箭啦,線上程中就是一個等待的執行緒,當 countdown 到 0 就不用再等待了,可以向下執行任務了。

上面分析了一下 CountdownLatch 的概念,相信大家也能體會它的使用場景了。在多個執行緒中,如果某個執行緒需要等待其他幾個執行緒執行某個操作後,才能向下執行動作的話,我們就可以使用 CountDownLatch 來實現多執行緒之間的同步。

說了這麼多,我們還是來看下 CountDownLatch 提供了哪些使用方法。

方法

  • public CountDownLatch(int count)

建構函式,需傳入計數的總數。

  • public void await()

阻塞執行緒,直到總計數值為0

  • public void countDown()

當前總計數減一

  • public long getCount()

當前總計數

通過上面 CountDownLatch 提供的幾個方法,我們可以看出來 CountDownLatch 沒有重新設定總計數的方法,也就是說這個類只有初始化的時候才設定一次,等計數完成後就不可再複用,需要重新建立一個新的 CountDownLatch 才可以再計數。

CountDownLatch 還有一個超時等待的 await 函式,這裡就不多分析了。CountDownLatch 幾個重要的方法我們已經知道了,現在來看看怎麼使用這幾個方法。

測試

先上例項程式碼,建立了5個執行緒,2個等待執行緒,3個執行 countdown 執行緒。

import java.util.concurrent.CountDownLatch;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class Test2Activity extends Activity {
	private CountDownLatch mCountDownLatch;
	
	@Override
	protected void onCreate(
Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_layout); mCountDownLatch = new CountDownLatch(3); new Thread(new Runnable() { @Override public void run() { try { Log.d("TAG", "Thread Main A start:"+mCountDownLatch.getCount()); mCountDownLatch.await(); Log.d("TAG", "Thread Main A end:"+mCountDownLatch.getCount()); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable() { @Override public void run() { try { Log.d("TAG", "Thread Main B start:"+mCountDownLatch.getCount()); mCountDownLatch.await(); Log.d("TAG", "Thread Main B end:"+mCountDownLatch.getCount()); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable() { @Override public void run() { mCountDownLatch.countDown(); Log.d("TAG", "Thread A:"+mCountDownLatch.getCount()); } }).start(); new Thread(new Runnable() { @Override public void run() { mCountDownLatch.countDown(); Log.d("TAG", "Thread B:"+mCountDownLatch.getCount()); } }).start(); new Thread(new Runnable() { @Override public void run() { mCountDownLatch.countDown(); Log.d("TAG", "Thread C:"+mCountDownLatch.getCount()); } }).start(); }

執行結果:

在這裡插入圖片描述

從列印的結果,我們可以看到,2 個等待執行緒都是在其他三個執行緒執行完 countDown() 再執行下一步的任務。CountDownLatch 使用起來也是挺簡單的,沒有過多的,複雜的方法。就像發射火箭,開始倒計時,然後發射,收工,不用考慮重複使用同一火箭。一次性使用,無後顧之憂!!!