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 ,所以會等這次循環走完纔會執行下一次循環。
}