Java --CountDownLatch簡介

來源:互聯網
上載者:User

標籤:

CountDownLatch

1、類介紹

一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。用給定的計數 初始化 CountDownLatch。由於調用了 countDown() 方法,所以在當前計數到達零之前,await 方法會一直受阻塞。之後,會釋放所有等待的線程,await 的所有後續調用都將立即返回。這種現象只出現一次——計數無法被重設。 一個線程(或者多個), 等待另外N個線程完成某個事情之後才能執行

 

2、使用情境 在一些應用場合中,需要等待某個條件達到要求後才能做後面的事情;同時當線程都完成後也會觸發事件,以便進行後面的操作。 這個時候就可以使用CountDownLatch。CountDownLatch最重要的方法是countDown()和await(),前者主要是倒數一次,後者是等待倒數到0,如果沒有到達0,就只有阻塞等待了。3、方法說明  await
public boolean await(long timeout,                     TimeUnit unit)              throws InterruptedException
使當前線程在鎖存器倒計數至零之前一直等待,除非線程被中斷或超出了指定的等待時間。如果當前計數為零,則此方法立刻返回  true 值。

如果當前計數大於零,則出於線程調度目的,將禁用當前線程,且在發生以下三種情況之一前,該線程將一直處於休眠狀態:

countDown()
     方法,計數到達零;或者
  • 其他某個線程中斷當前線程;或者
  • 已超出指定的等待時間。

如果計數到達零,則該方法返回 true 值。

 

  • 在進入此方法時已經設定了該線程的中斷狀態;或者
  • 在等待時被中斷,

InterruptedException,並且清除當前線程的已中止狀態。如果超出了指定的等待時間,則傳回值為 false。如果該時間小於等於零,則此方法根本不會等待。

 

參數:
timeout - 要等待的最長時間
unit -  timeout 參數的時間單位。
返回:
如果計數到達零,則返回  true;如果在計數到達零之前超過了等待時間,則返回  false
拋出:
InterruptedException - 如果當前線程在等待時被中斷
import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CountDownLatchTest {    // 類比了100米賽跑,10名選手已經準備就緒,只等裁判一聲令下。當所有人都到達終點時,比賽結束。    public static void main(String[] args) throws InterruptedException {        // 開始的倒數鎖        final CountDownLatch begin = new CountDownLatch(1);        // 結束的倒數鎖        final CountDownLatch end = new CountDownLatch(10);        // 十名選手        final ExecutorService exec = Executors.newFixedThreadPool(10);        for (int index = 0; index < 10; index++) {            final int NO = index + 1;            Runnable run = new Runnable() {                public void run() {                    try {                        // 如果當前計數為零,則此方法立即返回。                        // 等待                        begin.await();                        Thread.sleep((long) (Math.random() * 10000));                        System.out.println("No." + NO + " arrived");                    } catch (InterruptedException e) {                    } finally {                        // 每個選手到達終點時,end就減一                        end.countDown();                    }                }            };            exec.submit(run);        }        System.out.println("Game Start");        // begin減一,開始遊戲        begin.countDown();        // 等待end變為0,即所有選手到達終點        end.await();        System.out.println("Game Over");        exec.shutdown();    }}

輸出結果:

Game StartNo.7 arrivedNo.5 arrivedNo.9 arrivedNo.4 arrivedNo.8 arrivedNo.2 arrivedNo.3 arrivedNo.6 arrivedNo.1 arrivedNo.10 arrivedGame Over

 

 

轉載地址:http://www.itzhai.com/the-introduction-and-use-of-a-countdownlatch.html

Java --CountDownLatch簡介

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.