線程-CountDownLatch的使用

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 ,所以會等這次循環走完纔會執行下一次循環。
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章