欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程編程之CountDownLatch同步工具使用實例

 更新時間:2015年05月19日 10:12:24   投稿:junjie  
這篇文章主要介紹了Java多線程編程之CountDownLatch同步工具使用實例,需要的朋友可以參考下

好像倒計時計數(shù)器,調(diào)用CountDownLatch對象的countDown方法就將計數(shù)器減1,當?shù)竭_0時,所有等待者就開始執(zhí)行。

java.util.concurrent.CountDownLatch
一個同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個或多個線程一直等待。用給定的計數(shù)初始化CountDownLatch。由于調(diào)用了countDown()方法,所以在當前計數(shù)到達零之前,await方法會一直受阻塞。之后,會釋放所有等待的線程,await的所有后續(xù)調(diào)用都將立即返回。這種現(xiàn)象只出現(xiàn)一次——計數(shù)無法被重置。如果需要重置計數(shù),請考慮使用CyclicBarrier。

CountDownLatch是一個通用同步工具,它有很多用途。將計數(shù)1初始化的CountDownLatch用作一個簡單的開/關(guān)鎖存器,或入口:在通過調(diào)用countDown()的線程打開入口前,所有調(diào)用await的線程都一直在入口處等待。用N初始化的 CountDownLatch可以使一個線程在N個線程完成某項操作之前一直等待,或者使其在某項操作完成N次之前一直等待。

CountDownLatch的一個有用特性是,它不要求調(diào)用countDown方法的線程等到計數(shù)到達零時才繼續(xù),而在所有線程都能通過之前,它只是阻止任何線程繼續(xù)通過一個await。

舉例:多個運動員等待裁判命令:裁判等所有運動員到齊后發(fā)布結(jié)果

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();
    //裁判發(fā)布命令的計數(shù)器,計數(shù)器為0,運動員就跑
    final CountDownLatch cdOrder = new CountDownLatch(1);
    //運動員跑到終點的計數(shù)器,為0裁判宣布結(jié)果
    final CountDownLatch cdAnswer = new CountDownLatch(3); 
     
    //產(chǎn)生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() + "回應(yīng)命令處理結(jié)果");           
            cdAnswer.countDown();           
          } catch (Exception e) {
            e.printStackTrace();
          }       
        }
      };
      service.execute(runnable); //運動員開始任務(wù)
    }   
     
     
    try {
      //裁判休息一會 再發(fā)布命令
      Thread.sleep((long)(Math.random()*10000));
     
      System.out.println("線程" + Thread.currentThread().getName() + "即將發(fā)布命令");          
      cdOrder.countDown(); //命令計數(shù)器置為0,發(fā)布命令
      System.out.println("線程" + Thread.currentThread().getName() + "已發(fā)送命令,正在等待結(jié)果"); 
      cdAnswer.await(); //等待所有運動員,計數(shù)器為0 所有運動員到位
      System.out.println("線程" + Thread.currentThread().getName() + "已收到所有響應(yīng)結(jié)果"); 
    } catch (Exception e) {
      e.printStackTrace();
    }       
    service.shutdown();
 
  }
}

返回結(jié)果:

線程pool-1-thread-3正準備接受命令
線程pool-1-thread-1正準備接受命令
線程pool-1-thread-2正準備接受命令
線程main即將發(fā)布命令
線程main已發(fā)送命令,正在等待結(jié)果
線程pool-1-thread-2已接受命令
線程pool-1-thread-1已接受命令
線程pool-1-thread-3已接受命令
線程pool-1-thread-3回應(yīng)命令處理結(jié)果
線程pool-1-thread-2回應(yīng)命令處理結(jié)果
線程pool-1-thread-1回應(yīng)命令處理結(jié)果
線程main已收到所有響應(yīng)結(jié)果


相關(guān)文章

  • spring注解@Service注解的使用解析

    spring注解@Service注解的使用解析

    這篇文章主要介紹了spring注解@Service注解的使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java新API的時間格式化

    Java新API的時間格式化

    這篇文章主要介紹了Java新API的時間格式化,新的時間API的時間格式化由java.time.format.DateTimeFormatter負責,更多相關(guān)資料需要的小伙伴可以參考一下
    2022-05-05
  • SpringBoot中啟動時如何忽略某項檢測

    SpringBoot中啟動時如何忽略某項檢測

    這篇文章主要介紹了SpringBoot中啟動時如何忽略某項檢測,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java實現(xiàn)Map集合二級聯(lián)動示例

    Java實現(xiàn)Map集合二級聯(lián)動示例

    Java實現(xiàn)Map集合二級聯(lián)動示例,需要的朋友可以參考下
    2014-03-03
  • Java多線程之鎖學(xué)習(增強版)

    Java多線程之鎖學(xué)習(增強版)

    這篇文章主要為大家詳細介紹了Java多線程中鎖的相關(guān)知識,文中的示例代碼講解詳細,對我們了解線程有一定幫助,需要的可以參考一下
    2023-02-02
  • java使用mysql預(yù)編譯語句查詢優(yōu)勢及示例詳解

    java使用mysql預(yù)編譯語句查詢優(yōu)勢及示例詳解

    這篇文章主要為大家介紹了java使用mysql預(yù)編譯語句的優(yōu)勢特點及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Java中List<T> Map與Map List<T>的區(qū)別小結(jié)

    Java中List<T> Map與Map List<T>的區(qū)別小結(jié)

    本文主要介紹了Java中List<T> Map與Map List<T>的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-08-08
  • java實現(xiàn)多線程的兩種方式繼承Thread類和實現(xiàn)Runnable接口的方法

    java實現(xiàn)多線程的兩種方式繼承Thread類和實現(xiàn)Runnable接口的方法

    下面小編就為大家?guī)硪黄猨ava實現(xiàn)多線程的兩種方式繼承Thread類和實現(xiàn)Runnable接口的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • SpringBoot2.3集成ELK7.1.0的示例代碼

    SpringBoot2.3集成ELK7.1.0的示例代碼

    這篇文章主要介紹了SpringBoot2.3集成ELK7.1.0的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-08-08
  • java編寫一個花名隨機抽取器的實現(xiàn)示例

    java編寫一個花名隨機抽取器的實現(xiàn)示例

    這篇文章主要介紹了java編寫一個花名隨機抽取器的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-03-03

最新評論