標籤:
一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。
用給定的計數 初始化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);}}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
java並發編程之CountDownLatch