java并發編程之CountDownLatch

jopen 9年前發布 | 16K 次閱讀 Java開發 CountDownLatch

     一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。


用給定的計數 初始化CountDownLatch。由于調用了 countDown() 方法,所以在當前計數到達零之前,await 方法會一直受阻塞。之后,會釋放所有等待的線程,await 的所有后續調用都將立即返回。這種現象只出現一次——計數無法被重置。如果需要重置計數,請考慮使用 CyclicBarrier。


CountDownLatch是一個通用同步工具,它有很多用途。將計數 1 初始化的CountDownLatch用作一個簡單的開/關鎖存器,或入口:在通過調用 countDown() 的線程打開入口前,所有調用 await 的線程都一直在入口處等待。用 N 初始化的CountDownLatch可以使一個線程在 N 個線程完成某項操作之前一直等待,或者使其在某項操作完成 N 次之前一直等待。


CountDownLatch的一個有用特性是,它不要求調用countDown方法的線程等到計數到達零時才繼續,而在所有線程都能通過之前,它只是阻止任何線程繼續通過一個 await。


以下是一個簡單的例子

演示了啟動5個線程,等到所有線程執行完畢之后,打印出最后結果

    package com.lala.shop;

import java.time.Duration;  
import java.time.Instant;  
import java.util.Random;  
import java.util.concurrent.CountDownLatch;  
import java.util.concurrent.TimeUnit;  

public class CountDownLatchDemo   
{  
    /** 
     * 啟動size個線程,等到所有線程執行完畢之后,打印出最后結果 
     * @param size 
     */  
    public void demo(final int size)  
    {  
        CountDownLatch cdl = new CountDownLatch(size);  

        Instant start = Instant.now();  

        for(int i=1;i<=size;i++)  
        {  
            new Thread(() -> {  
                try  
                {  
                    long time = new Long(new Random().nextInt(10));  
                    TimeUnit.SECONDS.sleep(time);  
                    System.out.println(Thread.currentThread().getName() + " sleep " + time + " then finish ...");  
                    cdl.countDown();  
                } catch (InterruptedException e)  
                {  
                    e.printStackTrace();  
                }  
            }).start();  
        }  

        try   
        {  
            cdl.await();  
        } catch (InterruptedException e)  
        {  
            e.printStackTrace();  
        }  

        Instant end = Instant.now();  
        Duration time = Duration.between(start, end);  
        long seconds = time.getSeconds();//秒表示   

        System.out.println("finish this task ... spend time " + seconds + " seconds");  
    }  
    public static void main(String[] args)  
    {  
        new CountDownLatchDemo().demo(5);  
    }  
}  </pre><br />
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!