CountDownLatch的使用
遇到此問題的環境:我需要從資料庫中取出5000條資料,循環資料,對每條資料每個字段進行分析處理,這裡每個字段都會建立新的線程去處理,并寫庫;隻有當每個線程執行完,才能進行下一次的循環。
CountDownLatch
- countDownLatch這個類使一個線程等待其他線程各自執行完畢後再執行。
- 是通過一個計數器來實作的,計數器的初始值是線程的數量。每當一個線程執行完畢後,計數器的值就-1,當計數器的值為0時,表示所有線程都執行完畢,然後在閉鎖上等待的線程就可以恢複工作了。
private ExecutorService pool = null;
private static int zdNum = 16;// 字段數
public void run() {
// 建立線程池
pool = Executors.newFixedThreadPool(zdNum);
// 定義計數器
final CountDownLatch latch = new CountDownLatch(zdNum);
// 擷取5000條資料
List list = getData();
for(int i=1;i<=list.size();i++){
final int j = i; // 多線程中for循環變量需要拿出來定義
pool.execute(new Runnable() {
@Override
public void run() {
try{
switch(j) {
case 1:
case 2:
...
//分需求處理
}
}catch (Exception e) {
e.printStackTrace();
} finally {
latch.countDown();// 每個線程執行完,計數器-1 如果>0則會執行await方法阻塞線程。
}
}
});
}
latch.await();//阻塞目前線程,直到計數器的值為0 ,是以會等這次循環走完才會執行下一次循環。
}