程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java多線程編程之CountDownLatch同步對象應用實例

Java多線程編程之CountDownLatch同步對象應用實例

編輯:關於JAVA

Java多線程編程之CountDownLatch同步對象應用實例。本站提示廣大學習愛好者:(Java多線程編程之CountDownLatch同步對象應用實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Java多線程編程之CountDownLatch同步對象應用實例正文


似乎倒計時計數器,挪用CountDownLatch對象的countDown辦法就將計數器減1,當達到0時,一切期待者就開端履行。

java.util.concurrent.CountDownLatch
一個同步幫助類,在完成一組正在其他線程中履行的操作之前,它許可一個或多個線程一向期待。用給定的計數初始化CountDownLatch。因為挪用了countDown()辦法,所以在以後計數達到零之前,await辦法會一向受壅塞。以後,會釋放一切期待的線程,await的一切後續挪用都將立刻前往。這類景象只湧現一次——計數沒法被重置。假如須要重置計數,請斟酌應用CyclicBarrier。

CountDownLatch是一個通用同步對象,它有許多用處。將計數1初始化的CountDownLatch用作一個簡略的開/關鎖存器,或進口:在經由過程挪用countDown()的線程翻開進口前,一切挪用await的線程都一向在進口處期待。用N初始化的 CountDownLatch可使一個線程在N個線程完成某項操作之前一向期待,或許使其在某項操作完成N次之前一向期待。

CountDownLatch的一個有效特征是,它不請求挪用countDown辦法的線程比及計數達到零時才持續,而在一切線程都能經由過程之前,它只是阻攔任何線程持續經由過程一個await。

舉例:多個活動員期待裁判敕令:裁判等一切活動員到齊後宣布成果

package com.ljq.test.thread;
 
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class CountdownLatchTest {
 
  public static void main(String[] args) {
    ExecutorService service = Executors.newCachedThreadPool();
    //裁判宣布敕令的計數器,計數器為0,活動員就跑
    final CountDownLatch cdOrder = new CountDownLatch(1);
    //活動員跑到起點的計數器,為0裁判宣告成果
    final CountDownLatch cdAnswer = new CountDownLatch(3); 
     
    //發生3個活動員
    for(int i=0;i<3;i++){
      Runnable runnable = new Runnable(){
          public void run(){
          try {
            System.out.println("線程" + Thread.currentThread().getName() + "正預備接收敕令");            
            cdOrder.await();
            System.out.println("線程" + Thread.currentThread().getName() + "已接收敕令");               
            Thread.sleep((long)(Math.random()*10000)); 
            System.out.println("線程" + Thread.currentThread().getName() + "回報命令處置成果");           
            cdAnswer.countDown();           
          } catch (Exception e) {
            e.printStackTrace();
          }       
        }
      };
      service.execute(runnable); //活動員開端義務
    }   
     
     
    try {
      //裁判歇息一會 再宣布敕令
      Thread.sleep((long)(Math.random()*10000));
     
      System.out.println("線程" + Thread.currentThread().getName() + "行將宣布敕令");          
      cdOrder.countDown(); //敕令計數器置為0,宣布敕令
      System.out.println("線程" + Thread.currentThread().getName() + "已發送死令,正在期待成果"); 
      cdAnswer.await(); //期待一切活動員,計數器為0 一切活動員到位
      System.out.println("線程" + Thread.currentThread().getName() + "已收到一切呼應成果"); 
    } catch (Exception e) {
      e.printStackTrace();
    }       
    service.shutdown();
 
  }
}

前往成果:

線程pool-1-thread-3正預備接收敕令
線程pool-1-thread-1正預備接收敕令
線程pool-1-thread-2正預備接收敕令
線程main行將宣布敕令
線程main已發送死令,正在期待成果
線程pool-1-thread-2已接收敕令
線程pool-1-thread-1已接收敕令
線程pool-1-thread-3已接收敕令
線程pool-1-thread-3回報命令處置成果
線程pool-1-thread-2回報命令處置成果
線程pool-1-thread-1回報命令處置成果
線程main已收到一切呼應成果


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved