CountDownLatch了解

           CountDownLatch在java.util.concurrent.CountDownLatch包里面,他通常用在多線程中,假如說我們現(xiàn)在有一件事情開了多線程去完成,但是我們需要保證所有的線程都成功運(yùn)行結(jié)束,再去執(zhí)行后面的代碼,這個(gè)時(shí)候CountDownLatch這個(gè)類就派上用場(chǎng)了。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、嘉魚網(wǎng)絡(luò)推廣、微信小程序開發(fā)、嘉魚網(wǎng)絡(luò)營(yíng)銷、嘉魚企業(yè)策劃、嘉魚品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供嘉魚建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

我們可以把CountDownLatch傳入到每個(gè)線程里面去,在線程執(zhí)行成功時(shí)調(diào)用countDownLatch.countDown();方法,然后在主線程里面執(zhí)行完多線程初始化和分發(fā)執(zhí)行之后執(zhí)行countDownLatch.await();這樣,只有在每個(gè)線程執(zhí)行成功以后,也就是CountDownLatch的計(jì)數(shù)器減到0以后,才會(huì)執(zhí)行countDownLatch.await()后面的代碼。

簡(jiǎn)單的應(yīng)用場(chǎng)景是這樣的,但是具體的怎么設(shè)計(jì)還是需要仔細(xì)斟酌,否則有可能會(huì)出現(xiàn)countDownLatch.countDown();永遠(yuǎn)無法減為0的情況。

 

下面一個(gè)簡(jiǎn)單的例子來實(shí)現(xiàn)這一應(yīng)用場(chǎng)景:


package org.hzg.countDownLatch;

import java.util.concurrent.CountDownLatch;

/**
* Created by hzgal on 2019-3-5.
*/
public abstract class DangerCenter implements Runnable {
   private CountDownLatch countDownLatch;      //計(jì)數(shù)器
   private String station;                      //危險(xiǎn)品調(diào)度站
   private boolean isOkToSentCar;              //檢查結(jié)果,是否滿足發(fā)車條件

   public DangerCenter(CountDownLatch countDownLatch,String stationName) {
       this.countDownLatch = countDownLatch;
       this.station = stationName;
       this.isOkToSentCar = false;
   }

   @Override
   public void run() {
       try {
           check();
           isOkToSentCar = true;
       }catch (Exception e) {
           e.printStackTrace();
           isOkToSentCar = false;
       }finally {
           if(countDownLatch != null) {
               countDownLatch.countDown();
           }
       }
   }

   /**
    * 定義抽象的check方法,用于實(shí)現(xiàn)了DangerCenter的各級(jí)調(diào)度中心來重寫check方法,因?yàn)槊總€(gè)調(diào)度中心自檢的方法可能不一樣
    */
   public abstract void check();

   public CountDownLatch getCountDownLatch() {
       return countDownLatch;
   }

   public void setCountDownLatch(CountDownLatch countDownLatch) {
       this.countDownLatch = countDownLatch;
   }

   public String getStation() {
       return station;
   }

   public void setStation(String station) {
       this.station = station;
   }

   public boolean isOkToSentCar() {
       return isOkToSentCar;
   }

   public void setOkToSentCar(boolean okToSentCar) {
       isOkToSentCar = okToSentCar;
   }
}
package org.hzg.countDownLatch;

import java.util.concurrent.CountDownLatch;

/**
* Created by hzgal on 2019-3-5.
*/
public class BeijingStation extends DangerCenter {
   private static String stationName = "北京危險(xiǎn)品調(diào)度站";

   public BeijingStation(CountDownLatch countDownLatch) {
       super(countDownLatch,stationName);
   }

   @Override
   public void check() {
       System.out.println("北京調(diào)度站正在進(jìn)行車輛自檢..........");

       try {
           Thread.sleep(2000);
       }catch (Exception e) {
           e.printStackTrace();
       }

       System.out.println("北京調(diào)度站車輛自檢完畢,一切正常");
   }
}
package org.hzg.countDownLatch;

import java.util.concurrent.CountDownLatch;

/**
* Created by hzgal on 2019-3-5.
*/
public class ShandongStation extends DangerCenter {
   private static String stationName = "山東危險(xiǎn)品調(diào)度站";

   public ShandongStation(CountDownLatch countDownLatch) {
       super(countDownLatch,stationName);
   }

   @Override
   public void check() {
       System.out.println("山東調(diào)度站正在進(jìn)行車輛自檢..........");

       try {
           Thread.sleep(1000);
       }catch (Exception e) {
           e.printStackTrace();
       }

       System.out.println("山東調(diào)度站車輛自檢完畢,一切正常");
   }
}
package org.hzg.countDownLatch;

import java.util.concurrent.CountDownLatch;

/**
* Created by hzgal on 2019-3-5.
*/
public class ShanxiStation extends DangerCenter {
   private static String stationName = "陜西危險(xiǎn)品調(diào)度站";

   public ShanxiStation(CountDownLatch countDownLatch) {
       super(countDownLatch,stationName);
   }

   @Override
   public void check() {
       System.out.println("陜西調(diào)度站正在進(jìn)行車輛自檢..........");

       try {
           Thread.sleep(3000);
       }catch (Exception e) {
           e.printStackTrace();
       }

       System.out.println("陜西調(diào)度站車輛自檢完畢,一切正常");
   }
}
package org.hzg.countDownLatch;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
* Created by hzgal on 2019-3-5.
*/
public class Demo {
   public static void main(String[] args) {
       boolean isAllOk = true;

       List<DangerCenter> stationList = new ArrayList<DangerCenter>();
       CountDownLatch countDownLatch = new CountDownLatch(3);
       stationList.add(new BeijingStation(countDownLatch));
       stationList.add(new ShandongStation(countDownLatch));
       stationList.add(new ShanxiStation(countDownLatch));

       Executor stationThreadPool = Executors.newFixedThreadPool(3);

       for(DangerCenter stationCenter : stationList) {
           stationThreadPool.execute(stationCenter);
       }

       try {
           countDownLatch.await();
       }catch (Exception e) {
           e.printStackTrace();
       }

       for(DangerCenter stationCenter : stationList) {
           if(!stationCenter.isOkToSentCar()) {
               isAllOk = false;
           }
       }

       if (isAllOk) {
           System.out.println("所有站點(diǎn)檢查完畢,可以正常進(jìn)行發(fā)車?。。。。。。。?!");
       }
   }
}
程序運(yùn)行結(jié)果:

北京調(diào)度站正在進(jìn)行車輛自檢..........

山東調(diào)度站正在進(jìn)行車輛自檢..........

陜西調(diào)度站正在進(jìn)行車輛自檢..........

山東調(diào)度站車輛自檢完畢,一切正常

北京調(diào)度站車輛自檢完畢,一切正常

陜西調(diào)度站車輛自檢完畢,一切正常

所有站點(diǎn)檢查完畢,可以正常進(jìn)行發(fā)車?。。。。。。。。?/p>

網(wǎng)頁(yè)標(biāo)題:CountDownLatch了解
瀏覽路徑:http://muchs.cn/article6/ihscig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站排名、面包屑導(dǎo)航、網(wǎng)頁(yè)設(shè)計(jì)公司、品牌網(wǎng)站建設(shè)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)