Android中CountDownLatch實現多執行緒同步
阿新 • • 發佈:2018-12-14
簡介
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 使用起來也是挺簡單的,沒有過多的,複雜的方法。就像發射火箭,開始倒計時,然後發射,收工,不用考慮重複使用同一火箭。一次性使用,無後顧之憂!!!