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

Java線程池的拒絕策略實(shí)現(xiàn)詳解

 更新時(shí)間:2019年09月25日 15:06:34   作者:阿呆很呆非常呆  
這篇文章主要介紹了Java線程池的拒絕策略實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一、簡(jiǎn)介

jdk1.5 版本新增了JUC并發(fā)編程包,大大的簡(jiǎn)化了傳統(tǒng)的多線程開(kāi)發(fā)。

Java線程池,是典型的池化思想的產(chǎn)物,類似的還有數(shù)據(jù)庫(kù)的連接池、redis的連接池等。池化思想,就是在初始的時(shí)候去申請(qǐng)資源,創(chuàng)建一批可使用的連接,這樣在使用的時(shí)候,就不必再進(jìn)行創(chuàng)建連接信息的開(kāi)銷了。舉個(gè)生活中鮮明的例子,在去著名洋快餐某基或者某勞的時(shí)候,配餐人員是字節(jié)從一個(gè)中間的保溫箱里面直接取,然后打包就好了。不用再臨時(shí)的來(lái)了一個(gè)單子,又要去拿原材料,又要去進(jìn)行加工。效率明顯的就是提高了很多。

既然是池子,那么必然的會(huì)存在最大值、初始值以及存活值等屬性。在達(dá)到某些特定條件的時(shí)候,再來(lái)請(qǐng)求的話,池子是如何進(jìn)行請(qǐng)求處理的呢?這里就引出了池的拒絕策略。一般的數(shù)據(jù)庫(kù)連接池在達(dá)到最大連接數(shù)的時(shí)候會(huì)默認(rèn)的等待特定的設(shè)置的時(shí)間或者直接就拋出異常。而本文中要闡述的線程池卻并非如此的策略,下面開(kāi)始展開(kāi)講解下。

二、線程池的拒絕策略

線程池中,有三個(gè)重要的參數(shù),決定影響了拒絕策略:corePoolSize - 核心線程數(shù),也即最小的線程數(shù)。workQueue - 阻塞隊(duì)列 。maximumPoolSize - 最大線程數(shù)

當(dāng)提交任務(wù)數(shù)大于 corePoolSize 的時(shí)候,會(huì)優(yōu)先將任務(wù)放到 workQueue 阻塞隊(duì)列中。當(dāng)阻塞隊(duì)列飽和后,會(huì)擴(kuò)充線程池中線程數(shù),直到達(dá)到 maximumPoolSize 最大線程數(shù)配置。此時(shí),再多余的任務(wù),則會(huì)觸發(fā)線程池的拒絕策略了。

總結(jié)起來(lái),也就是一句話,當(dāng)提交的任務(wù)數(shù)大于(workQueue.size() + maximumPoolSize ),就會(huì)觸發(fā)線程池的拒絕策略。

三、拒絕策略定義

拒絕策略提供頂級(jí)接口 RejectedExecutionHandler ,其中方法 rejectedExecution 即定制具體的拒絕策略的執(zhí)行邏輯。

jdk默認(rèn)提供了四種拒絕策略:CallerRunsPolicy - 當(dāng)觸發(fā)拒絕策略,只要線程池沒(méi)有關(guān)閉的話,則使用調(diào)用線程直接運(yùn)行任務(wù)。

一般并發(fā)比較小,性能要求不高,不允許失敗。但是,由于調(diào)用者自己運(yùn)行任務(wù),如果任務(wù)提交速度過(guò)快,可能導(dǎo)致程序阻塞,性能效率上必然的損失較大

AbortPolicy - 丟棄任務(wù),并拋出拒絕執(zhí)行 RejectedExecutionException 異常信息。線程池默認(rèn)的拒絕策略。必須處理好拋出的異常,否則會(huì)打斷當(dāng)前的執(zhí)行流程,影響后續(xù)的任務(wù)執(zhí)行。

 DiscardPolicy - 直接丟棄,其他啥都沒(méi)有

DiscardOldestPolicy - 當(dāng)觸發(fā)拒絕策略,只要線程池沒(méi)有關(guān)閉的話,丟棄阻塞隊(duì)列 workQueue 中最老的一個(gè)任務(wù),并將新任務(wù)加入

四、測(cè)試代碼

1、AbortPolicy

package com.cfang;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class T2 {
 public static void main(String[] args) throws Exception{
  int corePoolSize = 5;
  int maximumPoolSize = 10;
  long keepAliveTime = 5;
  BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>(10);
  RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
  ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, handler);
  for(int i=0; i<100; i++) {
   try {
    executor.execute(new Thread(() -> log.info(Thread.currentThread().getName() + " is running")));
   } catch (Exception e) {
    log.error(e.getMessage());
   }
  }
  executor.shutdown();
 }
}

如果 executor.execute()提交任務(wù),由于會(huì)拋出 RuntimeException,沒(méi)有try.catch處理異常信息的話,會(huì)中斷調(diào)用者的處理流程,后續(xù)任務(wù)得不到執(zhí)行(跑不完100個(gè))??勺孕袦y(cè)試下。

2、CallerRunsPolicy

主體代碼同上,更換拒絕策略:

RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();

運(yùn)行后,在控制臺(tái)console中能夠看到的是,會(huì)有一部分的數(shù)據(jù)打印,顯示的是 “main is running”,也即體現(xiàn)調(diào)用線程處理。

3、DiscardPolicy

更換拒絕策略

RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();

直接丟棄任務(wù),實(shí)際運(yùn)行中,打印出的信息不會(huì)有100條。

4、DiscardOldestPolicy

同樣的,更換拒絕策略:

RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardOldestPolicy();

實(shí)際運(yùn)行,打印出的信息也會(huì)少于100條。

五、總結(jié)

四種拒絕策略是相互獨(dú)立無(wú)關(guān)的,選擇何種策略去執(zhí)行,還得結(jié)合具體的業(yè)務(wù)場(chǎng)景。實(shí)際工作中,一般直接使用 ExecutorService 的時(shí)候,都是使用的默認(rèn)的 defaultHandler ,也即 AbortPolicy 策略。

相關(guān)文章

  • Springcloud RestTemplate服務(wù)調(diào)用代碼實(shí)例

    Springcloud RestTemplate服務(wù)調(diào)用代碼實(shí)例

    這篇文章主要介紹了Springcloud RestTemplate服務(wù)調(diào)用代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Spring Boot Admin 環(huán)境搭建與基本使用詳解

    Spring Boot Admin 環(huán)境搭建與基本使用詳解

    這篇文章主要介紹了Spring Boot Admin 環(huán)境搭建與基本使用,本文主要是對(duì)于Spring Boot Admin的基本認(rèn)識(shí)和基本運(yùn)用,通過(guò)本篇博客能夠?qū)pring Boot Admin有一個(gè)宏觀認(rèn)知和能夠快速上手,需要的朋友可以參考下
    2023-08-08
  • Spring Boot 如何使用Liquibase 進(jìn)行數(shù)據(jù)庫(kù)遷移(操作方法)

    Spring Boot 如何使用Liquibase 進(jìn)行數(shù)據(jù)庫(kù)遷移(操作方法)

    在Spring Boot應(yīng)用程序中使用Liquibase進(jìn)行數(shù)據(jù)庫(kù)遷移是一種強(qiáng)大的方式來(lái)管理數(shù)據(jù)庫(kù)模式的變化,本文重點(diǎn)講解如何在Spring Boot應(yīng)用程序中使用Liquibase進(jìn)行數(shù)據(jù)庫(kù)遷移,從而更好地管理數(shù)據(jù)庫(kù)模式的變化,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • springboot中Getmapping獲取參數(shù)的實(shí)現(xiàn)方式

    springboot中Getmapping獲取參數(shù)的實(shí)現(xiàn)方式

    這篇文章主要介紹了springboot中Getmapping獲取參數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 關(guān)于@EnableGlobalMethodSecurity注解的用法解讀

    關(guān)于@EnableGlobalMethodSecurity注解的用法解讀

    這篇文章主要介紹了關(guān)于@EnableGlobalMethodSecurity注解的用法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • win11?idea?shift+F6快捷鍵失效問(wèn)題解決方案

    win11?idea?shift+F6快捷鍵失效問(wèn)題解決方案

    這篇文章主要介紹了win11?idea?shift+F6快捷鍵失效問(wèn)題,本文給大家分享最新解決方案,需要的朋友可以參考下
    2023-08-08
  • 談?wù)?Java 中 this 的使用方法

    談?wù)?Java 中 this 的使用方法

    這篇文章主要介紹了Java 中 this 的使用方法,需要的朋友可以參考下
    2014-01-01
  • 并行Stream與Spring事務(wù)相遇會(huì)發(fā)生什么?

    并行Stream與Spring事務(wù)相遇會(huì)發(fā)生什么?

    這篇文章主要介紹了并行Stream與Spring事務(wù)相遇會(huì)發(fā)生什么?文章主要解決實(shí)戰(zhàn)中的Bug及解決方案和技術(shù)延伸,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • 最全Gson使用

    最全Gson使用

    GSON彌補(bǔ)了JSON的許多不足的地方,在實(shí)際應(yīng)用中更加適用于Java開(kāi)發(fā),本文主要介紹了最全Gson使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 如何基于ssm框架實(shí)現(xiàn)springmvc攔截器

    如何基于ssm框架實(shí)現(xiàn)springmvc攔截器

    這篇文章主要介紹了如何基于ssm框架實(shí)現(xiàn)springmvc攔截器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

涿鹿县| 阿瓦提县| 若尔盖县| 喜德县| 疏勒县| 凯里市| 涪陵区| 德阳市| 揭阳市| 丹东市| 抚宁县| 林芝县| 奉节县| 石阡县| 宿松县| 平陆县| 郧西县| 晋中市| 曲松县| 普宁市| 河东区| 平顶山市| 石景山区| 遂平县| 灵台县| 贵定县| 同江市| 彭州市| 墨玉县| 台安县| 原阳县| 台江县| 库车县| 天津市| 武邑县| 五莲县| 万州区| 万源市| 剑川县| 英超| 普兰店市|