国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

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

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

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

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

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

線程池執行流程

想要真正的了解線程池的執行流程,就得先從線程池的執行方法 execute() 說起,execute() 實現源碼如下:24128資訊網——每日最新資訊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,則新建線程執行此任務,否則將執行線程池的拒絕策略,如下圖所示:24128資訊網——每日最新資訊28at.com

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

線程池拒絕策略

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

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

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

DiscardPolicy拒絕策略

接下來我們以 DiscardPolicy 忽略此任務,忽略最新的一個任務為例,演示一下拒絕策略的具體使用,實現代碼如下:24128資訊網——每日最新資訊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();}

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

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

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

AbortPolicy拒絕策略

為了和 DiscardPolicy 拒絕策略對比,我們來演示一下 JDK 默認的拒絕策略 AbortPolicy 中止策略,線程池會拋出異常并中止執行此任務,示例代碼如下:24128資訊網——每日最新資訊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();}

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

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

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

自定義拒絕策略

當然除了 JDK 提供的四種拒絕策略之外,我們還可以實現通過 new RejectedExecutionHandler,并重寫 rejectedExecution 方法來實現自定義拒絕策略,實現代碼如下:24128資訊網——每日最新資訊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);}

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

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

小結

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

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

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

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

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

標簽:
  • 熱門焦點
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
亚洲亚洲精品三区日韩精品在线视频| 精品欧美一区二区久久| 国产精品久久毛片| 欧美精品少妇一区二区三区| 日韩欧美中文一区| 欧美日韩综合| 亚洲猫色日本管| 国产精品资源在线| 国产婷婷精品| 久久―日本道色综合久久| 肉色丝袜一区二区| 欧美日韩免费| 欧美日韩一区二区三区四区五区| 国产精品福利电影一区二区三区四区| 狠狠色丁香婷婷综合| 日韩网站在线| 国产精品国产三级国产普通话蜜臀| 国产综合成人久久大片91| 国产精品黄色| 欧美电视剧免费全集观看| 奇米一区二区三区| 国产亚洲综合精品| 亚洲欧洲美洲综合色网| 91浏览器入口在线观看| 4438x成人网最大色成网站| 图片区日韩欧美亚洲| 亚洲网址在线| 国产精品欧美久久久久无广告 | 国产精品电影院| 国产精品s色| 国产欧美一区二区精品性| 欧美在线你懂得| 亚洲另类春色校园小说| 亚洲精选91| 亚洲精品免费一二三区| 一本一道久久综合狠狠老精东影业 | 久久精品国产免费| 日本高清无吗v一区| 日本亚洲三级在线| 欧美视频第二页| 九九九精品视频| 欧美老人xxxx18| 国产麻豆精品一区二区| 欧美无人高清视频在线观看| 日本中文字幕一区| 欧美精品aⅴ在线视频| 国产精品综合在线视频| 日韩欧美你懂的| 91蜜桃免费观看视频| 亚洲视频免费在线观看| 亚洲一区bb| 国产一二精品视频| 久久久精品一品道一区| 亚洲精品一区二| 日韩成人免费电影| 日韩精品中文字幕在线一区| 欧美国内亚洲| 蜜臀av亚洲一区中文字幕| 女主播福利一区| 久久精品视频免费| 欧美日韩国产在线观看| 日韩毛片一二三区| 欧美日本一道本在线视频| 亚洲精品一区二区三区樱花| 懂色av一区二区在线播放| 婷婷激情综合网| 亚洲图片你懂的| 久久伊人中文字幕| 欧美一区二区高清| 色婷婷精品大在线视频| 极品中文字幕一区| 国产一区不卡在线| 亚洲va韩国va欧美va| 2欧美一区二区三区在线观看视频| 一区二区三区福利| 99r精品视频| 奇米影视在线99精品| 欧美激情艳妇裸体舞| 在线播放中文字幕一区| 伊人久久亚洲热| www.日韩av| 精品影视av免费| 亚洲综合在线电影| 久久久精品一品道一区| 91.com在线观看| 一本色道久久综合亚洲精品不| 中文字幕亚洲一区二区av在线| 国产资源精品在线观看| 亚洲精品视频观看| 欧美激情资源网| 久久蜜桃av一区精品变态类天堂| 欧美日韩夫妻久久| 91国产福利在线| 99国产精品久久久久久久成人热| aaa国产一区| 99这里都是精品| 国产麻豆成人传媒免费观看| 日韩二区在线观看| 免费久久精品视频| 亚洲成va人在线观看| 亚洲综合激情另类小说区| 亚洲自拍偷拍网站| 一区二区三区精品在线观看| 亚洲激情自拍视频| 国产精品网站一区| 中文字幕一区二区三区不卡| 久久免费视频一区| 2022国产精品视频| 国产农村妇女毛片精品久久麻豆| 日韩美女视频在线| 精品国产免费人成在线观看| 国产精品成人网| 精品一区二区三区视频在线观看| 成人免费视频国产在线观看| 亚洲经典三级| 3d动漫精品啪啪1区2区免费| 日韩一级精品视频在线观看| 中文成人综合网| 亚洲国产一区二区在线播放| 精品亚洲成av人在线观看| 99久久精品情趣| 国内精品久久久久久久影视蜜臀 | 欧美一区二区三区公司| 国产亚洲一本大道中文在线| 亚洲色图一区二区三区| 午夜久久久久久久久| 久久精品国产色蜜蜜麻豆| 99视频超级精品| 国产精品毛片va一区二区三区| 欧美综合久久久| 欧美国产日本韩| 天堂av在线一区| 欧美日本一道本在线视频| 日韩欧美亚洲国产精品字幕久久久| 亚洲影院久久精品| 9人人澡人人爽人人精品| 亚洲激情六月丁香| 国产精品自在在线| 色老汉一区二区三区| 亚洲欧美国产毛片在线| www.欧美.com| 欧美一区二区三区的| 日韩精品久久久久久| 正在播放亚洲| 国产精品福利影院| 欧美一区激情| 26uuu精品一区二区在线观看| 久久天天做天天爱综合色| 亚洲精品乱码久久久久| 国产日本欧美一区二区| 久久新电视剧免费观看| 九九精品视频在线看| 美女被久久久| 天堂va蜜桃一区二区三区| 国产丶欧美丶日本不卡视频| 色综合av在线| 一区二区三区日韩欧美| 欧美私人啪啪vps| 精品国产亚洲一区二区三区在线观看 | 精品国产第一区二区三区观看体验 | 精品国产1区二区| 国产乱码精品一区二区三区忘忧草 | 午夜精品久久久久久久99樱桃 | 精品日本一线二线三线不卡| 久久se精品一区精品二区| 六月婷婷久久| 亚洲综合色自拍一区| 亚洲激情av| 国产精品第一页第二页第三页 | 久久午夜精品| 亚洲影视在线播放| 日韩天堂av| 综合色天天鬼久久鬼色| 国外精品视频| 国产精品久久毛片av大全日韩| 欧美99在线视频观看| www一区二区| 99视频在线精品| 欧美精品一区二区三| 波波电影院一区二区三区| 欧美xxxx老人做受| 成人高清视频免费观看| 日韩欧美电影一二三| 丁香天五香天堂综合| 欧美zozozo| 91麻豆免费视频| 国产亚洲欧美日韩在线一区| 99国产麻豆精品| 国产午夜亚洲精品午夜鲁丝片| 99精品欧美一区二区三区小说| 欧美大黄免费观看| 大白屁股一区二区视频| 欧美精品一区二区三区四区| 337p亚洲精品色噜噜噜| 国产精品久久久久久久裸模| 国内在线观看一区二区三区| 中文字幕一区二区在线观看| 亚洲国产一区二区三区a毛片| 亚洲精品国产第一综合99久久| 在线亚洲国产精品网站|