91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中CountDownLatch進行多線程同步詳解及實例代碼

發布時間:2020-08-28 18:19:45 來源:腳本之家 閱讀:126 作者:大愚若智_ 欄目:編程語言

Java中CountDownLatch進行多線程同步詳解

CountDownLatch介紹

在前面的Java學習筆記中,總結了Java中進行多線程同步的幾個方法:

1、synchronized關鍵字進行同步。
2、Lock鎖接口及其實現類ReentrantLock、ReadWriteLock鎖實現同步。
3、信號量Semaphore實現同步。

其中,synchronized關鍵字和Lock鎖解決的是多個線程對同一資源的并發訪問問題。信號量Semaphore解決的是多副本資源的共享訪問問題。

今天,來學習一下Java中的另外一個多線程同步輔助類:CountDownLatch。官方文檔對CountDownLatch的解釋是:在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。也就是說,CountDownLatch控制某個或者多個線程,讓它們等待多個線程完成某項任務后,再啟動。CountDownLatch主要是用來同步多個任務的執行,區別于其他的synchronized關鍵字,鎖,信號量是用來同步共享資源的。

CountDownLatch實現原理簡介:

CountDownLatch內部維護一個計數器,計數器的值為待完成的任務數N,需要等待這N個任務完成的線程調用

CountDownLatch的await()方法使自己進入休眠等待狀態。

當某一個任務線程完成某一個任務后調用CountDownLatch的countDown()方法來表示自己的任務已完成,此時CountDownLatch的計數器值減1,當所有的任務完成式,計數器的值為0。當計數器值為0時,CountDownLatch將喚醒所有因await()方法進入休眠的線程。

CountDownLatch的使用:

CountDownLatch的使用主要有3點:

1、CountDownLatch的聲明及初始化,在初始化時需要指定等待完成的任務數。

2、某一個任務完成時調用CountDownLatch的countDown()方法,向CountDownLatch報告自己的任務已經完成,

3、需要等待任務完成的線程調用CountDownLatch的await()方法,調用后該線程將進入休眠,并在所有任務數完成后CountDownLatch的計數器值為0時,因await()方法進行休眠的線程將被喚醒。

在此本人在Java 7并發編程實戰手冊該書中的CountDownLatch使用示例的基礎上做了部分改進,來演示CountDownLatch的使用詳情:

模擬10個參會者和一個主持人參加的一個會以,每個參會者及主持人需要等待其他的參會者均到場簽到之后,才能開始會以并發言。為此,先創建一個會以管理的類VideoConference,其提供一個arrive()方法供參會者調用來進行簽到。會議管理的擁有者是主持人,其等待每個參會者的簽到:

public class VideoConference implements Runnable{ 
  private final CountDownLatch countDownLatch; 
  private int number; 
  public VideoConference(int number) { 
    this.number = number; 
    this.countDownLatch = new CountDownLatch(number);//使用Number初始化其內部的計數器,當初始化完成后,不能再次初始化 
  } 
  public void arrive(String name){ 
    //每個需要同步的任務,在任務完成時,需要調用該方法 
    countDownLatch.countDown();//countDownLatch內部的計數器減1 
    System.out.print("arrive:"+name+"\n"); 
    try{ 
      countDownLatch.await();//await方法是線程進入休眠,當countDownLatch計數器為0時,將被喚醒 
      //線程被喚醒,在這里可以執行一系列任務 
      System.out.print("name:"+name + " say:let's start..." +"\n"); 
    }catch (InterruptedException e){ 
      e.printStackTrace(); 
    } 
  } 
  public void run(){ 
    System.out.print("has arrive:"+(number-countDownLatch.getCount())+"\n"); 
    try{ 
      countDownLatch.await();//await方法是線程進入休眠,當countDownLatch計數器為0時,將被喚醒 
      //線程被喚醒,在這里可以執行一系列任務 
      System.out.print("all arrived:"+(number-countDownLatch.getCount())+"\n"); 
    }catch (InterruptedException e){ 
      e.printStackTrace(); 
    } 
  } 
} 

創建一個參會者類Participant:

public class Participant implements Runnable{ 
  private VideoConference videoConference; 
  private String name; 
 
  public Participant(String name, VideoConference videoConference) { 
    this.name = name; 
    this.videoConference = videoConference; 
  } 
  public void run(){ 
    try { 
      //do something 
      Thread.sleep(50); 
      // 
      videoConference.arrive(name); 
    }catch (InterruptedException e){ 
      e.printStackTrace(); 
    } 
  } 
 
  public static void main(String[] args){ 
    VideoConference videoConference = new VideoConference(10); 
    Thread videoThread = new Thread(videoConference); 
    videoThread.start(); 
    for(int i=0; i<10; i++){ 
      Thread thread = new Thread(new Participant("participant:"+i,videoConference)); 
      thread.start(); 
    } 
  } 
} 

Participant類中的main函數首先創建了一個需要10個參會者參加的一個會議,之后,創建了10個參會者并逐個簽到,在10個參會者都簽到之后,每個參會者及主持人將被"喚醒"并發言。

總結:

CountDownLatch類解決的是多線程間的同步等待、任務協調問題,應用在如在啟動某個程序的主功能前,需要前置完成配置環境檢查、網絡檢查等多個子任務等類似的場景。在Java中,除了使用CountDownLatch來實現多線程間的同步等待以外,還可以使用柵欄技術CyclicBarrier來實現多線程間的同步等待、任務協調。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大方县| 延津县| 铜梁县| 温宿县| 勐海县| 龙门县| 绥棱县| 哈巴河县| 罗甸县| 福清市| 自治县| 宿州市| 秦皇岛市| 广饶县| 全州县| 宜良县| 鲜城| 柳林县| 博罗县| 云梦县| 汉寿县| 巴南区| 汝阳县| 韶山市| 广德县| 滦南县| 民勤县| 武隆县| 晋江市| 双辽市| 嵩明县| 榆社县| 六枝特区| 吉林省| 吉隆县| 天长市| 湟源县| 来凤县| 庆安县| 望城县| 云阳县|