1. 程式人生 > >Java併發程式設計-同步輔助類之CountDownLatch

Java併發程式設計-同步輔助類之CountDownLatch

操作方法

  • 建構函式CountDownLatch(int count),count表示要等待的運算元的數目。
  • await()方法,阻塞等待,需要其他執行緒完成期待的操作,直到count為0。
  • countDown()方法,當某一個操作完成後,呼叫此方法,count數減一。

CountDownLatch是通過一個計數器來實現的,計數器的初始值為執行緒的數量,此值是執行緒將要等待的運算元(執行緒的數量)。當某個執行緒為了想要執行這些操作而等待時, 它要使用 await()方法。此方法讓執行緒進入休眠直到操作完成。 當某個操作結束,它使用countDown() 方法來減少CountDownLatch類的內部計數器,計數器的值就會減1。當計數器到達0時,它表示所有的執行緒已經完成了任務,這個類會喚醒全部使用await() 方法休眠的執行緒們恢復執行任務。



注意 

一個countDownLatch的作用只能使用一次,當counDownLatch物件的計數器被初始化之後不能再次初始化或者修改。當呼叫countDown()方法使count為0時,await()方法阻塞的執行緒都會被喚醒執行,之後再使用countDown()等方法已經沒有用了,CountDownLatch物件也就沒有用了。

與Semaphore類或者lock類不同,CountDownLatch類不能保護共享資料,因為它不提供互斥訪問,它是用來同步執行多個任務或者執行緒。

單個CountDownLatch

只控制所有執行緒方法都完成後再執行其他操作

下面看一個例子大家就清楚CountDownLatch的用法了:

12345678910111213141516171819202122232425262public class Test {public static void main(String[] args) {   final CountDownLatch latch = new CountDownLatch(2);new Thread(){public void run() {try {System.out.println("子執行緒"+Thread.currentThread().getName()+"正在執行");Thread.sleep(3000);System.out.println("子執行緒"
+Thread.currentThread().getName()+"執行完畢");latch.countDown();} catch (InterruptedException e) {e.printStackTrace();}};}.start();new Thread(){public void run() {try {System.out.println("子執行緒"+Thread.currentThread().getName()+"正在執行");Thread.sleep(3000);System.out.println("子執行緒"+Thread.currentThread().getName()+"執行完畢");latch.countDown();} catch (InterruptedException e) {e.printStackTrace();}};}.start();try {System.out.println("等待2個子執行緒執行完畢...");latch.await();System.out.println("2個子執行緒已經執行完畢");System.out.println("繼續執行主執行緒");} catch (InterruptedException e) {e.printStackTrace();}}}

執行結果:

1234567執行緒Thread-0正在執行執行緒Thread-1正在執行等待2個子執行緒執行完畢...執行緒Thread-0執行完畢執行緒Thread-1執行完畢2個子執行緒已經執行完畢繼續執行主執行緒

2個CountDownLatch

一個用於控制等所有執行緒方法都準備好以後“同時開啟”,一個用於控制所有執行緒都結束後再繼續後續的操作

使用例項

package MyThread;
import java.util.concurrent.CountDownLatch;
public class Match {

    // 模擬了100米賽跑,10名選手已經準備就緒,只等裁判一聲令下。當所有人都到達終點時,比賽結束。
    public static void main(String[] args) throws InterruptedException {

        // 開始的倒數鎖 
        final CountDownLatch begin=new CountDownLatch(1) ;  
        // 結束的倒數鎖 
        final CountDownLatch end=new CountDownLatch(10);  
        // 十名選手 

        for (int index = 0; index < 10; index++) {
            new Thread(new player(begin, end),"player"+index).start();
        }  
        System.out.println("Game Start");  
        // begin減1,計算變為0,開始遊戲
        begin.countDown();  
        // 等待end變為0,即所有選手到達終點
        end.await();  
        System.out.println("Game Over");  

    }
}
class player implements Runnable{
    // 開始的倒數鎖 
    private  final CountDownLatch begin ;  
    // 結束的倒數鎖 
    private final CountDownLatch end;  

    player(CountDownLatch begin,CountDownLatch end){
        this.begin=begin;
        this.end=end;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {  
            // 如果當前計數為零,則此方法立即返回。
            // 等待
            begin.await();  
            Thread.sleep((long) (Math.random() * 10000));  
            System.out.println(Thread.currentThread().getName() + " arrived");  
        } catch (InterruptedException e) { 
            e.printStackTrace();          
        } finally {  
            // 每個選手到達終點時,end就減一
            end.countDown();
        }
    }
}

結果 
Game Start 
player7 arrived 
player2 arrived 
player3 arrived 
player6 arrived 
player4 arrived 
player0 arrived 
player9 arrived 
player1 arrived 
player5 arrived 
player8 arrived 
Game Over 

相關推薦

Java併發程式設計-同步輔助CountDownLatch

操作方法建構函式CountDownLatch(int count),count表示要等待的運算元的數目。await()方法,阻塞等待,需要其他執行緒完成期待的操作,直到count為0。countDown()方法,當某一個操作完成後,呼叫此方法,count數減一。CountDo

Java併發程式設計-同步輔助CyclicBarrier

在上一篇文章中我們介紹了同步輔助類CountDownLatch,在Java concurrent包下還有另一個同步輔助類CyclicBarrier與CountDownLatch非常類似,它也允許多個執行緒在某個點進行同步,但CyclicBarrier類更加強大。CyclicB

java併發程式設計實戰》:執行緒同步輔助訊號量(semaphore)

1.訊號量的概念: 訊號量是一種計數器,用來保護一個或者多個共享資源的訪問,它是併發程式設計的一種基礎工具,大多數程式語言都提供了這個機制。 2、訊號量控制執行緒訪問流程: 如果執行緒要訪問一個共享資源,它必須先獲得訊號量。如果訊號量的內部計數器大於0,訊號量將減1,然後

java併發程式設計(十)執行緒倒計數鎖存器CountDownLatch

一、定義一個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。用給定的計數 初始化 CountDownLatch。由於呼叫了 countDown() 方法,所以在當前計數到達零之前,await 方法會一直受阻塞。之後,會釋放所有等待的執行緒

java執行緒同步輔助的使用CountDownLatch

有時候我們開發的時候會使用到多執行緒,那問題又來了,多執行緒是非同步的,有時候我們的邏輯又需要同步的時候,我們該怎麼辦呢,其實java給我們提供了一個類CountDownLatch,計數上鎖。 寫得

Java多執行緒同步工具CountDownLatch

在過去我們實現多執行緒同步的程式碼中,往往使用join()、wait()、notiyAll()等執行緒間通訊的方式,隨著JUC包的不斷的完善,java為我們提供了豐富同步工具類,官方也鼓勵我們使用工具類來實現多執行緒的同步,今天我們就對其中CountDownLatch類的使用與底層實現進行分析與總結。 一、

Java併發程式設計基礎三大利器CountDownLatch

# 引言 上一篇文章我們介紹了`AQS`的訊號量`Semaphore`[《Java高併發程式設計基礎三大利器之Semaphore》](https://mp.weixin.qq.com/s/ic1lX1G3kYvmztTgN0Yihg),接下來應該輪到`CountDownLatch`了。 # 什麼是CountD

Java併發程式設計(十二)CountDownLatch和CyclicBarrier

一、CountDownLatch java.util.concurrent.CountDownLatch可以允許一個或多個執行緒等待其他執行緒操作。從countdown字面意義也可以理解,它是類似於一個倒計時鎖,這個倒計時是原子操作,同一時刻只能有一個執行緒操作倒計時。 CountDownL

(2.1.27.4)Java併發程式設計:原子Atomic

在Java中的併發包中了提供了以下幾種型別的原子類來來解決執行緒安全的問題。分為 基本資料型別原子類 陣列型別原子類 引用型別原子類 欄位型別原子類。 因為其內部原理都差不多一致。這裡會對每種型別的原子類抽一個來介紹。 一、原子類的使用方式 public c

java併發程式設計(六)讀寫鎖

一、讀寫鎖我們知道在多個執行緒訪問同一個資料的時候是存線上程安全問題的,而在僅僅是讀取資料的時候,是沒有安全問題的,那麼多個執行緒同時讀取資料我們就可以讓其不互斥;而多個執行緒都在修改(寫)資料或有的在讀取有的在寫入的時候再讓其互斥,這樣不但保證執行緒安全而且提高效能。Rea

Java併發程式設計--多執行緒HelloWorld

上篇部落格我們介紹了一些基本概念,程序、執行緒、併發。下面我們開始寫第一個多執行緒的程式。 兩種方式:一、實現Runnable介面;二、基礎Thread類。 一、實現Runnable介面 pack

JAVA 併發程式設計-讀寫鎖模擬快取系統(十一)

    在多執行緒中,為了提高效率有些共享資源允許同時進行多個讀的操作,但只允許一個寫的操作,比如一個檔案,只要其內容不變可以讓多個執行緒同時讀,不必做排他的鎖定,排他的鎖定只有在寫的時候需要,以保證別

java並發同步輔助CountDownLatch

java 同步 多線程 CountDownLatch 含義: CountDownLatch可以理解為一個計數器在初始化時設置初始值,當一個線程需要等待某些操作先完成時,需要調用await()方法。這個方法讓線程進入休眠狀態直到等待的所有線程都執行完成。每調用一次countDown()方法內部計數器

Java 併發程式設計詳解工具 CountDownLatch

CountDownLatch是一個在java1.5被引入同步工具類,它允許一個或多個執行緒一直等待,直到其他執行緒的操作執行完後再執行。countdownlatch在Java開發中應用場景及其廣泛,同時也是面試中的高頻考點。每一個Java程式設計師都應該熟練掌握,在本篇文章中,我將會從以下幾方面對其

【搞定Java併發程式設計】第25篇:Java中的併發工具同步屏障 CyclicBarrier

上一篇:Java中的併發工具類之CountDownLatch 本文目錄: 1、CyclicBarrier的簡單概述 2、CyclicBarrier 的原始碼分析 3、CyclicBarrier與CountDownLatch的區別 1、CyclicBarrier的簡單概述

【搞定Java併發程式設計】第24篇:Java中的併發工具CountDownLatch

上一篇:Java中的阻塞佇列 BlockingQueue 詳解 本文目錄: 1、CountDownLatch的基本概述 2、CountDownLatch的使用案例 3、CountDownLatch的原始碼分析 1、CountDownLatch的基本概述 Count

java並發同步輔助

ren new read sys art trac final 所有 ber CyclicBarrier 的字面意思是可循環使用(Cyclic)的屏障(Barrier)。它要做的事情是,讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最後一個線程到達屏障時,屏障才會開

java並發同步輔助semaphore

java 信號量 semaphore(sem??f?r)含義: 信號量就是可以聲明多把鎖(包括一把鎖:此時為互斥信號量)。舉個例子:一個房間如果只能容納5個人,多出來的人必須在門外面等著。如何去做呢?一個解決辦法就是:房間外面掛著五把鑰匙,每進去一個人就取走一把鑰匙,沒有鑰匙的不能進入該房間而是在外面

java並發同步輔助CyclicBarrier

java 多線程 CyclicBarrier含義: 柵欄允許兩個或者多個線程在某個集合點同步。當一個線程到達集合點時,它將調用await()方法等待其它的線程。線程調用await()方法後,CyclicBarrier將阻塞這個線程並將它置入休眠狀態等待其它線程的到來。等最後一個線程調用await()方

java並發同步輔助Phaser

java 多線程 Phaser含義: 更加復雜和強大的同步輔助類。它允許並發執行多階段任務。當我們有並發任務並且需要分解成幾步執行時,(CyclicBarrier是分成兩步),就可以選擇使用Phaser。Phaser類機制是在每一步結束的位置對線程進行同步,當所有的線程都完成了這一步,才允許執行下一步