最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java并發(fā)包中CountDownLatch和線程池的使用詳解

 更新時(shí)間:2021年02月18日 10:58:24   作者:chen_yuxi  
這篇文章主要介紹了java并發(fā)包中CountDownLatch和線程池的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

1.CountDownLatch

現(xiàn)在做的這個(gè)華為云TaurusDB比賽中,參考的之前參加過(guò)阿里的PolarDB大賽的兩個(gè)大佬的代碼,發(fā)現(xiàn)都有用到CountDownLatch這個(gè)類,之前看代碼的時(shí)候也看過(guò),但是沒(méi)有搞得很明白,自己寫(xiě)也寫(xiě)不出來(lái),在此自己先學(xué)習(xí)一下。

字面理解:CountDownLatch:數(shù)量減少的門(mén)栓。

創(chuàng)建這樣一個(gè)門(mén)栓

CountDownLatch countDownLatch = new CountDownLatch(count);

參數(shù):count,門(mén)栓的計(jì)數(shù)次數(shù)。

在所有線程執(zhí)行完成之前,調(diào)用countDownLatch.await()阻塞主線程。

每當(dāng)一個(gè)線程執(zhí)行完一個(gè)指定動(dòng)作之后,count就會(huì)減少1,當(dāng)count等于0時(shí),主線程不再阻塞,開(kāi)始繼續(xù)執(zhí)行下面的代碼,當(dāng)count大于0時(shí),主線程一直阻塞,等待count變?yōu)?。每個(gè)線程動(dòng)作執(zhí)行結(jié)束后,執(zhí)行countDownLatch.countDown(),這個(gè)門(mén)栓的count減一。

int ThreadNum = 16;
CountDownLatch countDownLatch = new CountDownLatch(ThreadNum);
for(int i = 0; i < ThreadNum ; i++){
 final int finalI = i;
 new Thread(() -> {
  int n = 0;
  System.out.println("線程應(yīng)該做的事情");
  while(n < 10){
   n++;
  }
  countDownLatch.countDown();
 }).start();
}
try{
 countDownLatch.await();
}catch(InterruptedException e){
 logger.infor("InterruptedException!!");
}

2.線程池

其實(shí)線程池之前的ipv6的項(xiàng)目里用過(guò),但是也忘記得差不多了,復(fù)習(xí)一下。

線程在創(chuàng)建和關(guān)閉時(shí)都需要花費(fèi)時(shí)間,如果為每一個(gè)小的任務(wù)都創(chuàng)建一個(gè)線程,可能創(chuàng)建和銷毀線程所用的時(shí)間會(huì)多于該線程真實(shí)工作所消耗的時(shí)間,就會(huì)得不償失。除了時(shí)間,空間也需要考慮,線程本身也是要占用內(nèi)存空間的,大量的線程會(huì)食用過(guò)多的內(nèi)存資源,可能會(huì)造成OOM。另外在回收時(shí),大量的線程會(huì)延長(zhǎng)GC的停頓時(shí)間。

因此在生產(chǎn)環(huán)境中使用線程必須對(duì)其加以控制和管理

使用線程池之后,創(chuàng)建線程變成了從線程池中獲得空閑的線程,關(guān)閉線程變成了歸還線程給線程池。

通過(guò)ThreadPoolExecutor可以創(chuàng)建一個(gè)線程池,ThreadPoolExecutor實(shí)現(xiàn)了Executors接口。

舉個(gè)栗子:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadPoolTest {
 public static void main(String[] args) {
  ThreadPoolExecutor pool = new ThreadPoolExecutor(10,20,60, 
    TimeUnit.SECOUNDS,new ArrayBlockingQueue<Runnable>(15000),new ThreadFactory(){
   private AtomicInteger threadId = new AtomicInteger(0);
   @Override
   public Thread newThread(Runnable r){
    Thread thread = new Thread(r);
    thread.setDaemon(true);
    String prefix = "thread-";
    thread.setName(prefix+threadId.incrementAndGet());
    return thread;
   } 
  });
 }
}

這樣就創(chuàng)建了一個(gè)線程池。參數(shù)依次解釋:

corePoolSize:指定了線程池中線程的數(shù)量,線程池中可以有10個(gè)存活的線程

maximumPoolSize:指定了線程池中最大的線程數(shù),線程池中最多能有20個(gè)存活的線程

keepAliveTime:當(dāng)線程池中的數(shù)量超過(guò)corePoolSize時(shí),這些線程在多長(zhǎng)時(shí)間會(huì)被銷毀,60s

unit:keepAliveTime的單位

workQueue:任務(wù)隊(duì)列,被提交但是沒(méi)有被執(zhí)行的任務(wù)存在的地方。他是一個(gè)BlockingQueue<Runnable>接口的對(duì)象。

threadFactory:線程工廠,你想創(chuàng)建什么樣子的線程

重點(diǎn)說(shuō)一下workQueue:

根據(jù)隊(duì)列的功能分類,可以使用以下幾種BlockingQueue接口

補(bǔ)充:Java中CountDownLatch,CyclicBarrier以及Semaphore的使用場(chǎng)景

Java并發(fā)包中提供了很多有用的工具類來(lái)幫助開(kāi)發(fā)者進(jìn)行并發(fā)編程,今天我就來(lái)說(shuō)說(shuō)CountDownLatch,CyclicBarrier以及Semaphore這三個(gè)的用法和使用場(chǎng)景。

1.CountDownLatch使用場(chǎng)景和用法

CountDownLatch一般是用于某個(gè)線程等待其他線程執(zhí)行完之后,它才能執(zhí)行。例如一家人在等待爸爸媽媽回家,才能進(jìn)行晚宴,示例代碼如下:

public class CountDownLatchTest {
 
 public static void main(String[] args) throws Exception {
  final CountDownLatch cdl = new CountDownLatch(2);
  new Thread(){
   public void run() {
    try {
     System.out.println("等待老爸回家...");
     Thread.sleep(5000);
     cdl.countDown();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    
   };
  }.start();
  
  new Thread(){
   public void run() {
    try {
     System.out.println("等待老媽回家...");
     Thread.sleep(5000);
     cdl.countDown();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   };
  }.start();
  
  cdl.await();
  System.out.println("老爸老媽回來(lái)了...");
  System.out.println("晚宴開(kāi)始了...");
 }
 
}

2.CyclicBarrier(柵欄)使用場(chǎng)景和用法

CyclicBarrier一般是一組線程等待至某個(gè)狀態(tài),然后這一組線程才能同時(shí)執(zhí)行(感覺(jué)跟CountDownLatch有點(diǎn)類似啊,不過(guò)仔細(xì)想想還是有差別的,感覺(jué)容易混淆)。

代碼示例如下:

public class CyclicBarrierTest {
 
 public static void main(String[] args) {
  int count = 3;
  CyclicBarrier cb = new CyclicBarrier(count, new Runnable() {
   @Override
   public void run() {
    //此處所有線程都調(diào)用了await方法之后,會(huì)走到這里
    System.out.println("所有線程操作完成之后都調(diào)用了await方法");
   }
  });
  
  for(int i=0;i<count;i++){
   new WriteLogHandler(cb).start();
  }
 }
 
 static class WriteLogHandler extends Thread{
  
  private CyclicBarrier cb = null;
  
  public WriteLogHandler(CyclicBarrier cb) {
   this.cb = cb;
  }
  
  @Override
  public void run() {
   try {
    System.out.println("線程:" + Thread.currentThread().getName() + "開(kāi)始寫(xiě)日志");
    Thread.sleep(2000);
    System.out.println("線程:" + Thread.currentThread().getName() + "寫(xiě)日志結(jié)束,等待其他線程");
    cb.await();
    
    System.out.println("所有線程寫(xiě)日志數(shù)據(jù)結(jié)束,繼續(xù)其他操作");
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
 
}

3.Semaphore(信號(hào)量)使用場(chǎng)景和用法

Semaphore類似鎖的用法,用于控制對(duì)某資源的訪問(wèn)權(quán)限,示例代碼如下:
public class SemaphoreTest {
 
 public static void main(String[] args) {
  ExecutorService executor = Executors.newCachedThreadPool();
  final Semaphore semaphore = new Semaphore(5);
  
  for(int i=0;i<10;i++){
   final int num = i;
   executor.execute(new Runnable() {
    @Override
    public void run() {
     try {
      semaphore.acquire();
      System.out.println("正在執(zhí)行任務(wù)" + num);
      Thread.sleep((long)Math.random() * 1000);
      System.out.println("任務(wù)" + num + "執(zhí)行結(jié)束");
      semaphore.release();
     } catch (Exception e) {
      e.printStackTrace();
     }
    }
   });
  }
  executor.shutdown();
 }
 
}

以上就是這三個(gè)并發(fā)工具類的使用場(chǎng)景和示例,僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。歡迎大家一起交流。

相關(guān)文章

  • Java時(shí)間工具類Date的常用處理方法

    Java時(shí)間工具類Date的常用處理方法

    在Java中獲取當(dāng)前時(shí)間,可以使用 java.util.Date 類和 java.util.Calendar 類完成。其中,Date 類主要封裝了系統(tǒng)的日期和時(shí)間的信息,下面將詳細(xì)介紹Date類的常用處理方法,需要的可以參考一下
    2022-05-05
  • 使用Java快速將Web中表格轉(zhuǎn)換成Excel的方法

    使用Java快速將Web中表格轉(zhuǎn)換成Excel的方法

    在平時(shí)做系統(tǒng)項(xiàng)目時(shí),經(jīng)常會(huì)需要做導(dǎo)出功能,下面這篇文章主要給大家介紹了關(guān)于使用Java快速將Web中表格轉(zhuǎn)換成Excel的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Java零基礎(chǔ)也看得懂的單例模式與final及抽象類和接口詳解

    Java零基礎(chǔ)也看得懂的單例模式與final及抽象類和接口詳解

    本文主要講了單例模式中的餓漢式和懶漢式的區(qū)別,final的使用,抽象類的介紹以及接口的具體內(nèi)容,感興趣的朋友來(lái)看看吧
    2022-05-05
  • AQS同步組件CyclicBarrier循環(huán)屏障用例剖析

    AQS同步組件CyclicBarrier循環(huán)屏障用例剖析

    這篇文章主要為大家介紹了AQS同步組件CyclicBarrier循環(huán)屏障用例剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Java利用LocalDate進(jìn)行日期處理的完全指南

    Java利用LocalDate進(jìn)行日期處理的完全指南

    這篇文章主要為大家詳細(xì)介紹了Java利用LocalDate進(jìn)行日期處理的詳細(xì)教程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • java客戶端線上Apollo服務(wù)端的實(shí)現(xiàn)

    java客戶端線上Apollo服務(wù)端的實(shí)現(xiàn)

    這篇文章主要介紹了java客戶端線上Apollo服務(wù)端的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • SpringMVC異常處理知識(shí)點(diǎn)總結(jié)

    SpringMVC異常處理知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于SpringMVC異常處理相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-10-10
  • 一文帶你玩轉(zhuǎn)Java異常處理

    一文帶你玩轉(zhuǎn)Java異常處理

    這篇文章主要為大家介紹一下Java中的異常處理機(jī)制,文中通過(guò)示例為大家進(jìn)行了詳細(xì)的介紹,對(duì)我們學(xué)習(xí)有一定的幫助,感興趣的可以了解一下
    2022-08-08
  • 從JVM分析Java的類的加載和卸載機(jī)制

    從JVM分析Java的類的加載和卸載機(jī)制

    這篇文章主要介紹了從JVM分析Java的類的加載和卸載機(jī)制,講解了Java類的聲明周期,需要的朋友可以參考下
    2015-11-11
  • java基于odbc連接oracle的實(shí)現(xiàn)方法

    java基于odbc連接oracle的實(shí)現(xiàn)方法

    這篇文章主要介紹了java基于odbc連接oracle的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了連接操作的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-09-09

最新評(píng)論

汶川县| 鲁甸县| 阿荣旗| 潜山县| 和平县| 吴川市| 平阳县| 循化| 大姚县| 湘阴县| 合水县| 岳阳市| 镇康县| 五家渠市| 息烽县| 桃园市| 武宁县| 遵义县| 江油市| 班玛县| 特克斯县| 莒南县| 黄大仙区| 岱山县| 延津县| 中超| 太仓市| 武城县| 通辽市| 太谷县| 杭锦后旗| 无极县| 湘西| 梓潼县| 苏尼特右旗| 长宁县| 铅山县| 奈曼旗| 花垣县| 辽宁省| 南江县|