日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

面試必問:線程池是如何執行的?它的拒絕策略有哪些?

來源: 責編: 時間:2023-08-20 23:17:03 638觀看
導讀聊到線程池就一定會聊到線程池的執行流程,也就是當有一個任務進入線程池之后,線程池是如何執行的?我們今天就來聊聊這個話題。線程池是如何執行的?線程池的拒絕策略有哪些?線程池執行流程想要真正的了解線程池的執行流程,就

dEp28資訊網——每日最新資訊28at.com

聊到線程池就一定會聊到線程池的執行流程,也就是當有一個任務進入線程池之后,線程池是如何執行的?我們今天就來聊聊這個話題。線程池是如何執行的?線程池的拒絕策略有哪些?dEp28資訊網——每日最新資訊28at.com

線程池執行流程

想要真正的了解線程池的執行流程,就得先從線程池的執行方法 execute() 說起,execute() 實現源碼如下:dEp28資訊網——每日最新資訊28at.com

public void execute(Runnable command) {    if (command == null)        throw new NullPointerException();    int c = ctl.get();    // 當前工作的線程數小于核心線程數    if (workerCountOf(c) < corePoolSize) {        // 創建新的線程執行此任務        if (addWorker(command, true))            return;        c = ctl.get();    }    // 檢查線程池是否處于運行狀態,如果是則把任務添加到隊列    if (isRunning(c) && workQueue.offer(command)) {        int recheck = ctl.get();        // 再次檢線程池是否處于運行狀態,防止在第一次校驗通過后線程池關閉        // 如果是非運行狀態,則將剛加入隊列的任務移除        if (! isRunning(recheck) && remove(command))            reject(command);        // 如果線程池的線程數為 0 時(當 corePoolSize 設置為 0 時會發生)        else if (workerCountOf(recheck) == 0)            addWorker(null, false); // 新建線程執行任務    }    // 核心線程都在忙且隊列都已爆滿,嘗試新啟動一個線程執行失敗    else if (!addWorker(command, false))         // 執行拒絕策略        reject(command);}

從上述源碼我們可以看出,當任務來了之后,線程池的執行流程是:先判斷當前線程數是否大于核心線程數?如果結果為 false,則新建線程并執行任務;如果結果為 true,則判斷任務隊列是否已滿?如果結果為 false,則把任務添加到任務隊列中等待線程執行,否則則判斷當前線程數量是否超過最大線程數?如果結果為 false,則新建線程執行此任務,否則將執行線程池的拒絕策略,如下圖所示:dEp28資訊網——每日最新資訊28at.com

dEp28資訊網——每日最新資訊28at.com

線程池拒絕策略

當任務過多且線程池的任務隊列已滿時,此時就會執行線程池的拒絕策略,線程池的拒絕策略默認有以下 4 種:dEp28資訊網——每日最新資訊28at.com

  1. AbortPolicy:中止策略,線程池會拋出異常并中止執行此任務。
  2. CallerRunsPolicy:把任務交給添加此任務的(main)線程來執行。
  3. DiscardPolicy:忽略此任務,忽略最新的一個任務。
  4. DiscardOldestPolicy:忽略最早的任務,最先加入隊列的任務。

默認的拒絕策略為 AbortPolicy 中止策略。dEp28資訊網——每日最新資訊28at.com

DiscardPolicy拒絕策略

接下來我們以 DiscardPolicy 忽略此任務,忽略最新的一個任務為例,演示一下拒絕策略的具體使用,實現代碼如下:dEp28資訊網——每日最新資訊28at.com

public static void main(String[] args) {    // 任務的具體方法    Runnable runnable = new Runnable() {        @Override        public void run() {            System.out.println("當前任務被執行,執行時間:" + new Date() +                               " 執行線程:" + Thread.currentThread().getName());            try {                // 等待 1s                TimeUnit.SECONDS.sleep(1);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    };    // 創建線程,線程的任務隊列的長度為 1    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1,                                                           100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1),                                                           new ThreadPoolExecutor.DiscardPolicy());    // 添加并執行 4 個任務    threadPool.execute(runnable);    threadPool.execute(runnable);    threadPool.execute(runnable);    threadPool.execute(runnable);    // 線程池執行完任務,關閉線程池    threadPool.shutdown();}

以上程序的執行結果如下:dEp28資訊網——每日最新資訊28at.com

dEp28資訊網——每日最新資訊28at.com

從上述執行結果可以看出,給線程池添加了 4 個任務,而線程池只執行了 2 個任務就結束了,其他兩個任務執行了拒絕策略 DiscardPolicy 被忽略了,這就是拒絕策略的作用。dEp28資訊網——每日最新資訊28at.com

AbortPolicy拒絕策略

為了和 DiscardPolicy 拒絕策略對比,我們來演示一下 JDK 默認的拒絕策略 AbortPolicy 中止策略,線程池會拋出異常并中止執行此任務,示例代碼如下:dEp28資訊網——每日最新資訊28at.com

public static void main(String[] args) {    // 任務的具體方法    Runnable runnable = new Runnable() {        @Override        public void run() {            System.out.println("當前任務被執行,執行時間:" + new Date() +                               " 執行線程:" + Thread.currentThread().getName());            try {                // 等待 1s                TimeUnit.SECONDS.sleep(1);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    };    // 創建線程,線程的任務隊列的長度為 1    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1,                                                           100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1),                                                           new ThreadPoolExecutor.AbortPolicy()); // 顯式指定拒絕策略,也可以忽略此設置,它為默認拒絕策略    // 添加并執行 4 個任務    threadPool.execute(runnable);    threadPool.execute(runnable);    threadPool.execute(runnable);    threadPool.execute(runnable);    // 線程池執行完任務,關閉線程池    threadPool.shutdown();}

以上程序的執行結果如下:dEp28資訊網——每日最新資訊28at.com

dEp28資訊網——每日最新資訊28at.com

從結果可以看出,給線程池添加了 4 個任務,線程池正常執行了 2 個任務,其他兩個任務執行了中止策略,并拋出了拒絕執行的異常 RejectedExecutionException。dEp28資訊網——每日最新資訊28at.com

自定義拒絕策略

當然除了 JDK 提供的四種拒絕策略之外,我們還可以實現通過 new RejectedExecutionHandler,并重寫 rejectedExecution 方法來實現自定義拒絕策略,實現代碼如下:dEp28資訊網——每日最新資訊28at.com

public static void main(String[] args) {    // 任務的具體方法    Runnable runnable = new Runnable() {        @Override        public void run() {            System.out.println("當前任務被執行,執行時間:" + new Date() +                               " 執行線程:" + Thread.currentThread().getName());            try {                // 等待 1s                TimeUnit.SECONDS.sleep(1);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    };    // 創建線程,線程的任務隊列的長度為 1    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1,                                                           100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1),                                                           new RejectedExecutionHandler() {                                                               @Override                                                               public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {                                                                   // 執行自定義拒絕策略的相關操作                                                                   System.out.println("我是自定義拒絕策略~");                                                               }                                                           });    // 添加并執行 4 個任務    threadPool.execute(runnable);    threadPool.execute(runnable);    threadPool.execute(runnable);    threadPool.execute(runnable);}

以上程序的執行結果如下:dEp28資訊網——每日最新資訊28at.com

dEp28資訊網——每日最新資訊28at.com

小結

線程池的執行流程有 3 個重要的判斷點(判斷順序依次往后):判斷當前線程數和核心線程數、判斷當前任務隊列是否已滿、判斷當前線程數是否已達到最大線程數。如果經過以上 3 個判斷,得到的結果都會 true,則會執行線程池的拒絕策略。JDK 提供了 4 種拒絕策略,我們還可以通過 new RejectedExecutionHandler 并重寫 rejectedExecution 方法來實現自定義拒絕策略。dEp28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-6174-0.html面試必問:線程池是如何執行的?它的拒絕策略有哪些?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 六種在 React 中獲取數據的方法

下一篇: 揭穿DevOps的5個謠言!

標簽:
  • 熱門焦點
  • 6月安卓手機性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發布之前,性能榜的榜單大體會以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領先
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 從零到英雄:高并發與性能優化的神奇之旅

    作者 | 波哥審校 | 重樓作為公司的架構師或者程序員,你是否曾經為公司的系統在面對高并發和性能瓶頸時感到手足無措或者焦頭爛額呢?筆者在出道那會為此是吃盡了苦頭的,不過也得
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進展,其中榮耀、三星都已陸續發布了最新的折疊屏旗艦,尤其號榮耀Magi
  • 機構稱Q2國內智能手機銷量同比下滑4% vivo份額重回第1

    7月29日消息,根據市場調查機構Counterpoint Research公布的最新報告,2023年第2季度中國智能手機銷量同比下降4%,創新自2014年以來第2季度銷量新低。報
  • 國行版三星Galaxy Z Fold5/Z Flip5發布 售價7499元起

    2023年8月3日,三星電子舉行Galaxy新品中國發布會,正式在國內推出了新一代折疊屏智能手機三星Galaxy Z Fold5與Galaxy Z Flip5,以及三星Galaxy Tab S9
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美日韩精品不卡| 午夜久久久久久| 黄网站色欧美视频| 在线观看福利一区| 99精品视频网| 欧美亚洲一级| 欧美大片免费观看| 欧美午夜片在线观看| 国产日韩欧美三级| 在线免费观看日韩欧美| 99精品免费视频| 欧美在线免费一级片| 欧美成人免费观看| 国产精品网站在线观看| 一区精品久久| 99精品热视频| 久久国产成人| 欧美激情一区在线观看| 国产欧美精品在线播放| 亚洲高清在线精品| 亚洲自拍偷拍麻豆| 欧美国产一区二区| 国产欧美一区视频| 99国产精品国产精品毛片| 久久成人这里只有精品| 欧美日韩国产精品一卡| 狠狠色狠狠色综合日日tαg| 99国产精品久久| 久久久欧美精品| 国产精品v一区二区三区| 尤物九九久久国产精品的特点| 亚洲婷婷综合色高清在线| 久久夜色撩人精品| 国产精品久久久久免费a∨| 亚洲国产精品黑人久久久 | 亚洲美女色禁图| 久久精品系列| 国产精品美女主播在线观看纯欲| 亚洲国产婷婷| 久久久久国产精品www| 国产精品久久久久久久久久久久| 亚洲国产精品成人一区二区| 欧美一区二区三区成人| 欧美日韩另类综合| 亚洲国产小视频在线观看| 久久国产精品72免费观看| 国产精品国产三级国产| 亚洲精品精选| 久久欧美中文字幕| 国产日韩欧美高清| 亚洲午夜精品国产| 欧美精品色综合| 亚洲电影视频在线| 久久激情视频久久| 国产目拍亚洲精品99久久精品 | 国模精品娜娜一二三区| 亚洲先锋成人| 欧美日韩国产精品一区| 亚洲欧洲日夜超级视频| 老司机凹凸av亚洲导航| 国产字幕视频一区二区| 午夜精品视频在线观看| 国产精品久久久久9999高清| 99精品国产在热久久婷婷| 欧美电影资源| 亚洲国内自拍| 欧美成人精品三级在线观看 | 一区二区黄色| 欧美绝品在线观看成人午夜影视| 在线色欧美三级视频| 久久视频在线视频| 激情丁香综合| 久久人体大胆视频| 激情久久婷婷| 久久国产精品99国产| 国产视频久久网| 午夜日韩在线观看| 国产欧美精品一区二区色综合 | 国产精品网站视频| 亚洲欧美中文日韩在线| 国产精品麻豆va在线播放| 亚洲午夜在线视频| 国产精品久久久久一区| 亚洲性色视频| 国产精品一区二区久久国产| 亚洲欧美日韩电影| 国产农村妇女毛片精品久久莱园子| 亚洲欧美国产一区二区三区| 国产精品欧美日韩一区| 欧美在线播放视频| 今天的高清视频免费播放成人 | 在线视频日韩精品| 国产精品99免费看| 亚洲欧美在线免费| 国产一区二区在线观看免费| 久久一区二区三区四区五区| 亚洲国产高清自拍| 欧美久久视频| 亚洲欧美日本国产专区一区| 国产视频久久久久| 毛片av中文字幕一区二区| 亚洲精品你懂的| 国产精品s色| 久久精品国产69国产精品亚洲| 狠狠色2019综合网| 欧美高清在线| 亚洲视频日本| 国产一区二区三区久久久| 蜜桃伊人久久| 一区二区三区免费网站| 国产免费成人av| 蜜桃av噜噜一区二区三区| 亚洲日本va在线观看| 欧美视频在线观看一区二区| 欧美一级片久久久久久久| 影音欧美亚洲| 欧美日韩精品一区二区| 欧美一区二区在线看| 亚洲高清在线精品| 国产精品成人一区二区| 久久久久久久久久久久久久一区 | 国产精品国产三级国产 | 免费不卡视频| 中文一区二区| 国内偷自视频区视频综合| 欧美大胆人体视频| 亚洲一区二区三区四区视频 | 香蕉久久精品日日躁夜夜躁| 伊人久久久大香线蕉综合直播| 欧美巨乳在线| 欧美一区二区三区在线看| 亚洲国产成人av在线| 国产精品久久久久久久久久ktv| 久久久噜噜噜久久久| 日韩视频在线观看一区二区| 国产日韩精品一区| 欧美日韩国产va另类| 久久爱www| 亚洲毛片在线观看.| 国产无一区二区| 欧美日本韩国| 久久久999成人| 亚洲天堂男人| 亚洲黄色毛片| 国产欧美一区二区三区久久人妖| 欧美成人综合网站| 久久国产毛片| 亚洲一二区在线| 亚洲国产99| 国产亚洲一区精品| 国产精品ⅴa在线观看h| 欧美不卡一区| 久久精品国产v日韩v亚洲| 国产精品99久久久久久白浆小说| 伊人久久噜噜噜躁狠狠躁| 国产精品日本一区二区| 欧美久久久久免费| 另类成人小视频在线| 性色一区二区三区| 在线视频免费在线观看一区二区| 136国产福利精品导航网址应用| 国产精品女同互慰在线看| 欧美精品在线观看播放| 久久免费视频在线观看| 亚洲女女女同性video| 亚洲精品中文字| 又紧又大又爽精品一区二区| 国产美女一区二区| 欧美三级视频在线| 欧美二区在线观看| 久久综合色综合88| 久久精品视频在线观看| 亚洲欧美一区二区三区极速播放| 亚洲精品永久免费精品| 在线日本高清免费不卡| 海角社区69精品视频| 国产免费观看久久黄| 国产精品美女久久久久久免费| 欧美日韩国产成人在线91| 欧美成人r级一区二区三区| 久久久久久久久久久一区| 午夜精品一区二区三区在线播放| 亚洲视频狠狠| 中文网丁香综合网| 9色porny自拍视频一区二区| 亚洲欧洲一区二区三区久久| 亚洲第一综合天堂另类专| 伊人激情综合| 黄色成人av网| 激情成人在线视频| 极品尤物久久久av免费看| 国产日韩专区| 国产亚洲精品高潮| 国产亚洲第一区| 久久精品国产v日韩v亚洲| 午夜精品久久一牛影视| 亚洲已满18点击进入久久| 亚洲网站视频福利| 亚洲视频中文字幕| 亚洲永久精品大片| 亚洲欧美日韩一区| 欧美亚洲视频在线观看| 欧美一区二区三区的| 欧美中文在线字幕|