CountDownLatch如何使用?


  • CountDownLatch 可以起到發令槍的作用,JDK 1.5 開始提供
  • 用 CountDownLatch 實現並發訪問,在寫測試工具時希望達到某條件后,所有線程同時執行
  • 也可以用 CountDownLatch 實現,某線程等待其他線程完成,進行最后的統一處理

 

代碼如下:

package constxiong.interview;

import java.util.concurrent.CountDownLatch;

/**
 * 測試使用100個線程,並發訪問和等待多線程完成后處理
 * @author ConstXiong
 */
public class TestCountDownLatch2 {

    private static CountDownLatch cdl = new CountDownLatch(100);
    
    private static int count = 0;
    
    public static void main(String[] args) {
        testConcurrent();
//        testDoAfterOtherThreadComplete();
    }
    
    /**
     * 測試並發  do something...
     */
    private static void testConcurrent() {
        for (int i = 0; i < 100; i++) {
            //啟動線程
            new Thread(() -> {
                try {
                    //當發令槍計數未減到 0 之前線程都會在此阻塞
                    cdl.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ":" + System.currentTimeMillis() + " do something...");
            }).start();
            
            //發令槍計數減 1
            cdl.countDown();
        }
    }
    
    //測試等待多線程完成后處理
    private static void testDoAfterOtherThreadComplete() {
        //啟動 100 個線程,對 count 遞增
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                count++;
                //發令槍計數減 1
                cdl.countDown();
            }).start();
        }
        
        try {
            cdl.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main thread print count : " + count);
    }
    
}

 


原文鏈接
 


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM