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

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

【踩坑指南】線程池使用不當的五個坑

來源: 責編: 時間:2024-02-04 09:00:55 231觀看
導讀線程池是 Java 多線程編程中的一個重要概念,它可以有效地管理和復用線程資源,提高系統的性能和穩定性。但是線程池的使用也有一些注意事項和常見的錯誤,如果不小心,就可能會導致一些嚴重的問題,比如內存泄漏、死鎖、性能下

線程池是 Java 多線程編程中的一個重要概念,它可以有效地管理和復用線程資源,提高系統的性能和穩定性。但是線程池的使用也有一些注意事項和常見的錯誤,如果不小心,就可能會導致一些嚴重的問題,比如內存泄漏、死鎖、性能下降等。最后文末還有免費紅包封面可以領取,回饋給各位讀者朋友。JNp28資訊網——每日最新資訊28at.com

本文將介紹線程池使用不當的五個坑,以及如何避免和解決它們,大綱如下,JNp28資訊網——每日最新資訊28at.com

圖片JNp28資訊網——每日最新資訊28at.com

坑一:線程池中異常消失

線程池執行方法時要添加異常處理,這是一個老生常談的問題,可是直到最近我都有同事還在犯這個錯誤,所以我還是要講一下,不過我還提到了一種優雅的線程池全局異常處理的方法,大家可以往下看。JNp28資訊網——每日最新資訊28at.com

問題原因

@Testpublic void test() throws Exception {    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(        5,         10,         60,        TimeUnit.SECONDS,         new ArrayBlockingQueue<>(100000));    Future<Integer> submit = threadPoolExecutor.execute(() -> {        int i = 1 / 0; // 發生異常        return i;    });}

如上代碼,在線程池執行任務時,沒有添加異常處理。導致任務內部發生異常時,內部錯誤無法被記錄下來。JNp28資訊網——每日最新資訊28at.com

解決方法

在線程池執行任務方法內添加 try/catch 處理,代碼如下,JNp28資訊網——每日最新資訊28at.com

@Testpublic void test() throws Exception {    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(        5,         10,         60,        TimeUnit.SECONDS,         new ArrayBlockingQueue<>(100000));    Future<Integer> submit = threadPoolExecutor.execute(() -> {        try {            int i = 1 / 0;            return i;        } catch (Exception e) {            log.error(e.getMessage(), e);            return null;        }    });}

優雅的進行線程池異常處理

當線程池調用任務方法很多時,那么每個線程池任務執行的方法內都要添加 try/catch 處理,這就不優雅了,其實 ThreadPoolExecutor 線程池類支持傳入 ThreadFactory 參數用于自定義線程工廠,這樣我們在創建線程時,就可以指定 setUncaughtExceptionHandler 異常處理方法。JNp28資訊網——每日最新資訊28at.com

這樣就可以做到全局處理異常了,代碼如下,JNp28資訊網——每日最新資訊28at.com

ThreadFactory threadFactory = r -> {    Thread thread = new Thread(r);    thread.setUncaughtExceptionHandler((t, e) -> {        // 記錄線程異常        log.error(e.getMessage(), e);    });    return thread;};ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(    5,     10,     60,    TimeUnit.SECONDS,     new ArrayBlockingQueue<>(100000));threadPoolExecutor.execute(() -> {    log.info("---------------------");    int i = 1 / 0;});

不過要注意的是上面 setUncaughtExceptionHandler 方法只能針對線程池的 execute 方法來全局處理異常。對于線程池的 submit 方法是無法處理的。JNp28資訊網——每日最新資訊28at.com

坑二:拒絕策略設置錯誤導致接口超時

在 Java 中,線程池拒絕策略可以說一個常見八股文問題。大家雖然都記住了線程池有四種決絕策略,可是實際代碼編寫中,我發現大多數人都只會用 CallerRunsPolicy 策略(由調用線程處理任務)。我吃過這個虧,因此也拿出來講講。JNp28資訊網——每日最新資訊28at.com

問題原因

曾經有一個線上業務接口使用了線程池進行第三方接口調用,線程池配置里的拒絕策略采用的是 CallerRunsPolicy。示例代碼如下,JNp28資訊網——每日最新資訊28at.com

// 某個線上線程池配置如下ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(        50, // 最小核心線程數        50, // 最大線程數,當隊列滿時,能創建的最大線程數        60L, TimeUnit.SECONDS, // 空閑線程超過核心線程時,回收該線程的最大等待時間        new LinkedBlockingQueue<>(5000), // 阻塞隊列大小,當核心線程使用滿時,新的線程會放進隊列        new CustomizableThreadFactory("task"), // 自定義線程名        new ThreadPoolExecutor.CallerRunsPolicy() // 線程執行的拒絕策略);threadPoolExecutor.execute(() -> {    // 調用第三方接口    ...});

在第三方接口異常的情況下,線程池任務調用第三方接口一直超時,導致核心線程數、最大線程數堆積被占滿、阻塞隊列也被占滿的情況下,也就會執行拒絕策略,但是由于使用的是 CallerRunsPolicy 策略,導致線程任務直接由我們的業務線程來執行。JNp28資訊網——每日最新資訊28at.com

因為第三方接口異常,所以業務線程執行也會繼繼續超時,線上服務采用的 Tomcat 容器,最終也就導致 Tomcat 的最大線程數也被占滿,進而無法繼續向外提供服務。JNp28資訊網——每日最新資訊28at.com

解決方法

首先我們要考慮業務接口的可用性,就算線程池任務被丟棄,也不應該影響業務接口。JNp28資訊網——每日最新資訊28at.com

在業務接口穩定性得到保證的情況下,在考慮到線程池任務的重要性,不是很重要的話,可以使用 DiscardPolicy 策略直接丟棄,要是很重要,可以考慮使用消息隊列來替換線程池。JNp28資訊網——每日最新資訊28at.com

坑三:重復創建線程池導致內存溢出

不知道大家有沒有犯過這個問題,不過我確實犯過,歸根結底還是寫代碼前,沒有思考好業務邏輯,直接動手,寫一步算一步

本文鏈接:http://www.www897cc.com/showinfo-26-72429-0.html【踩坑指南】線程池使用不當的五個坑

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

上一篇: 深入了解Java 8 新特性-日期時間API之LocalDateTime類

下一篇: 什么是數據同步利器DataX,如何使用?

標簽:
  • 熱門焦點
  • 六大權益!華為8月服務日開啟:手機免費貼膜、維修免人工費

    8月5日消息,一年一度的華為開發者大會2023(Together)日前在松山湖拉開帷幕,與此同時,華為8月服務日也式開啟,到店可享六大專屬權益。華為用戶可在華為商城Ap
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 網紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業評論6月26日高調宣布入市,網絡名嘴大v胡錫進居然進軍了股市。在一次財經媒體峰會上,幾個財經圈媒體大佬就&ldquo;胡錫進炒股是否知道認真報道&rdquo;展開討論。有
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • iQOO 11S評測:行業唯一的200W標準版旗艦

    【Techweb評測】去年底,iQOO推出了“電競旗艦”iQOO 11系列,作為一款性能強機,該機不僅全球首發2K 144Hz E6全感屏,搭載了第二代驍龍8平臺及144Hz電競
  • 7月4日見!iQOO 11S官宣:“雞血版”驍龍8 Gen2+200W快充加持

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • Meta盲目擴張致超萬人被裁,重金押注元宇宙而前景未明

    圖片來源:圖蟲創意日前,Meta創始人兼CEO 馬克&middot;扎克伯發布公開信,宣布Meta計劃裁員超11000人,占其員工總數13%。他公開承認了自己的預判失誤:&ldquo;不僅
Top 主站蜘蛛池模板: 兴城市| 宣城市| 密山市| 甘南县| 嘉兴市| 景东| 盈江县| 平南县| 延庆县| 涿州市| 甘肃省| 宿州市| 峨边| 齐齐哈尔市| 贵南县| 东乌珠穆沁旗| 台东县| 武陟县| 永兴县| 石棉县| 秦安县| 山东省| 寿光市| 邹城市| 云和县| 郓城县| 肥东县| 时尚| 洛扎县| 汶川县| 东宁县| 江都市| 石嘴山市| 永登县| 饶阳县| 镇康县| 嘉定区| 长武县| 青冈县| 内乡县| 肇庆市|