真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何優(yōu)雅解決線程池中的異常?-創(chuàng)新互聯(lián)

在Java開發(fā)中,線程池的使用必不可少,使用無返回值 ? execute()??方法時,線程執(zhí)行發(fā)生異常的話,需要記錄日志,方便回溯,一般做法是在線程執(zhí)行方法內(nèi) try/catch 處理,如下:

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、南澗網(wǎng)站維護、網(wǎng)站推廣。
@Test
public void test() throws Exception {
    ThreadPoolExecutor threadPoolExecutor = 
            new ThreadPoolExecutor(5, 10, 60,
            TimeUnit.SECONDS, 
            new ArrayBlockingQueue<>(100000));
    Futuresubmit = threadPoolExecutor.execute(() ->{
        try {
            int i = 1 / 0;
            return i;
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return null;
        }
    });
}

但是當(dāng)線程池調(diào)用方法很多時,那么每個線程執(zhí)行方法內(nèi)都要?try/catch處理,這就不優(yōu)雅了,其實ThreadPoolExecutor類還支持傳入?ThreadFactory參數(shù),自定義線程工廠,在創(chuàng)建?thread時,指定?setUncaughtExceptionHandler異常處理方法,這樣就可以做到全局處理異常了,代碼如下:

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),
        threadFactory);
threadPoolExecutor.execute(() ->{
    log.info("---------------------");
    int i = 1 / 0;
});

線程池決絕策略設(shè)置錯誤導(dǎo)致業(yè)務(wù)接口執(zhí)行超時

先介紹下線程池得四種決絕策略

  • AbortPolicy:丟棄任務(wù)并拋出RejectedExecutionException異常,這是線程池默認(rèn)的拒絕策略
  • DiscardPolicy:丟棄任務(wù),但是不拋出異常。如果線程隊列已滿,則后續(xù)提交的任務(wù)都會被丟棄,且是靜默丟棄。 使用此策略,可能會使我們無法發(fā)現(xiàn)系統(tǒng)的異常狀態(tài)。建議是一些無關(guān)緊要的業(yè)務(wù)采用此策略
  • DiscardOldestPolicy:丟棄隊列最前面的任務(wù),然后重新提交被拒絕的任務(wù)。此拒絕策略,是一種喜新厭舊的拒絕策略。是否要采用此種拒絕策略,還得根據(jù)實際業(yè)務(wù)是否允許丟棄老任務(wù)來認(rèn)真衡量。
  • CallerRunsPolicy:由調(diào)用線程處理該任務(wù)

如下是一個線上業(yè)務(wù)接口使用得線程池配置,決絕策略采用?CallerRunsPolicy

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

在某些情況下,子線程任務(wù)調(diào)用第三方接口超時,導(dǎo)致核心線程數(shù)、大線程數(shù)占滿、阻塞隊列占滿的情況下執(zhí)行拒絕策略時,由于使用?CallerRunsPolicy策略,導(dǎo)致業(yè)務(wù)線程執(zhí)行子任務(wù)時繼續(xù)超時,進而導(dǎo)致接口執(zhí)行異常,這種情況下,考慮到子線程任務(wù)得重要性,不是很重要得話,可以使用?DiscardPolicy策略,要是很重要,可以發(fā)送到消息隊列中持久化子線程任務(wù)數(shù)據(jù)待后續(xù)處理

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


標(biāo)題名稱:如何優(yōu)雅解決線程池中的異常?-創(chuàng)新互聯(lián)
URL標(biāo)題:http://weahome.cn/article/ddedpd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部