AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

Java線程池中線程異常后:是銷毀還是復(fù)用

來源: 責編: 時間:2024-06-14 08:52:26 145觀看
導(dǎo)讀一個線程池中的線程異常了,那么線程池會怎么處理這個線程?需要說明,本文的線程池都是java.util.concurrent.ExecutorService線程池,本文將圍繞驗證,閱讀源碼倆方面來解析這個問題。代碼驗證驗證execute提交線程池中測試代

2Bd28資訊網(wǎng)——每日最新資訊28at.com

一個線程池中的線程異常了,那么線程池會怎么處理這個線程?2Bd28資訊網(wǎng)——每日最新資訊28at.com

2Bd28資訊網(wǎng)——每日最新資訊28at.com

2Bd28資訊網(wǎng)——每日最新資訊28at.com

需要說明,本文的線程池都是java.util.concurrent.ExecutorService線程池,本文將圍繞驗證,閱讀源碼倆方面來解析這個問題。2Bd28資訊網(wǎng)——每日最新資訊28at.com

2Bd28資訊網(wǎng)——每日最新資訊28at.com

代碼驗證

驗證execute提交線程池中

測試代碼:2Bd28資訊網(wǎng)——每日最新資訊28at.com

public class ThreadPoolExecutorDeadTest {    public static void main(String[] args) throws InterruptedException {        ExecutorService executorService = buildThreadPoolExecutor();        executorService.execute(() -> exeTask("execute"));        executorService.execute(() -> exeTask("execute"));        executorService.execute(() -> exeTask("execute-exception"));        executorService.execute(() -> exeTask("execute"));        executorService.execute(() -> exeTask("execute"));        Thread.sleep(5000);        System.out.println("再次執(zhí)行任務(wù)=======================");        executorService.execute(() -> exeTask("execute"));        executorService.execute(() -> exeTask("execute"));        executorService.execute(() -> exeTask("execute"));        executorService.execute(() -> exeTask("execute"));        executorService.execute(() -> exeTask("execute"));    }    public static ExecutorService buildThreadPoolExecutor() {        return new ThreadPoolExecutor(5, 10, 30, TimeUnit.SECONDS,                new LinkedBlockingQueue<>(1000), new ThreadFactoryBuilder().setNameFormat("test-%s").build()                , new ThreadPoolExecutor.CallerRunsPolicy());    }    private static void exeTask(String name) {        String printStr = "[thread-name:" + Thread.currentThread().getName() + ",執(zhí)行方式:" + name + "]";        if ("execute-exception".equals(name)) {            throw new RuntimeException(printStr + ", 我拋異常了");        } else {            System.out.println(printStr);        }    }}

執(zhí)行結(jié)果如下:2Bd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2Bd28資訊網(wǎng)——每日最新資訊28at.com

結(jié)論:2Bd28資訊網(wǎng)——每日最新資訊28at.com

execute 提交到線程池的方式,如果執(zhí)行中拋出異常,并且沒有在執(zhí)行邏輯中catch,那么會拋出異常,并且移除拋出異常的線程,創(chuàng)建新的線程放入到線程池中。2Bd28資訊網(wǎng)——每日最新資訊28at.com

驗證submit提交線程池中

測試代碼:2Bd28資訊網(wǎng)——每日最新資訊28at.com

public class ThreadPoolExecutorDeadTest {    public static void main(String[] args) throws InterruptedException {        ExecutorService executorService = buildThreadPoolExecutor();        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute-exception"));        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute"));        Thread.sleep(5000);        System.out.println("再次執(zhí)行任務(wù)=======================");        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute"));        executorService.submit(() -> exeTask("execute"));    }    public static ExecutorService buildThreadPoolExecutor() {        return new ThreadPoolExecutor(5, 10, 30, TimeUnit.SECONDS,                new LinkedBlockingQueue<>(1000), new ThreadFactoryBuilder().setNameFormat("test-%s").build()                , new ThreadPoolExecutor.CallerRunsPolicy());    }    private static void exeTask(String name) {        String printStr = "[thread-name:" + Thread.currentThread().getName() + ",執(zhí)行方式:" + name + "]";        if ("execute-exception".equals(name)) {            throw new RuntimeException(printStr + ", 我拋異常了");        } else {            System.out.println(printStr);        }    }}

執(zhí)行結(jié)果如下:2Bd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2Bd28資訊網(wǎng)——每日最新資訊28at.com

結(jié)論:2Bd28資訊網(wǎng)——每日最新資訊28at.com

submit 提交到線程池的方式,如果執(zhí)行中拋出異常,并且沒有catch,不會拋出異常,不會創(chuàng)建新的線程。2Bd28資訊網(wǎng)——每日最新資訊28at.com

源碼解析

1.java.util.concurrent.AbstractExecutorService#submit(java.lang.Runnable);2Bd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2Bd28資訊網(wǎng)——每日最新資訊28at.com

2. 查看execute方法的執(zhí)行邏輯;2Bd28資訊網(wǎng)——每日最新資訊28at.com

2Bd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2Bd28資訊網(wǎng)——每日最新資訊28at.com

3. java.util.concurrent.ThreadPoolExecutor#processWorkerExit;2Bd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2Bd28資訊網(wǎng)——每日最新資訊28at.com

可以發(fā)現(xiàn),如果拋出異常,會移除拋出異常的線程,創(chuàng)建新的線程。2Bd28資訊網(wǎng)——每日最新資訊28at.com

4. 為什么submit方法,沒有創(chuàng)建新的線程,而是繼續(xù)復(fù)用原線程;2Bd28資訊網(wǎng)——每日最新資訊28at.com

還記得,我們在3.1的時候,發(fā)現(xiàn)submit也是調(diào)用了execute方法,但是在調(diào)用之前,包裝了一層 RunnableFuture,那一定是在RunnableFuture的實現(xiàn) FutureTask中有特殊處理了,我們查看源碼可以發(fā)現(xiàn)。2Bd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2Bd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2Bd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2Bd28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2Bd28資訊網(wǎng)——每日最新資訊28at.com

但是,我們通過java.util.concurrent.FutureTask#get()就可以獲取對應(yīng)的異常信息。2Bd28資訊網(wǎng)——每日最新資訊28at.com

2Bd28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

當一個線程池里面的線程異常后:2Bd28資訊網(wǎng)——每日最新資訊28at.com

  • 當執(zhí)行方式是execute時,可以看到堆棧異常的輸出,線程池會把這個線程移除掉,并創(chuàng)建一個新的線程放到線程池中。
  • 當執(zhí)行方式是submit時,堆棧異常沒有輸出。但是調(diào)用Future.get()方法時,可以捕獲到異常,不會把這個線程移除掉,也不會創(chuàng)建新的線程放入到線程池中。

以上倆種執(zhí)行方式,都不會影響線程池里面其他線程的正常執(zhí)行。2Bd28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-93697-0.htmlJava線程池中線程異常后:是銷毀還是復(fù)用

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

上一篇: 大廠面試必備:如何輕松實現(xiàn)分布式Session管理?

下一篇: Go必知必會:數(shù)組和切片詳解

標簽:
  • 熱門焦點
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協(xié)調(diào)和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現(xiàn)手段有以下幾種方式:Object 類下
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優(yōu)化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現(xiàn)了一個流處理程序
  • 不容錯過的MSBuild技巧,必備用法詳解和實踐指南

    一、MSBuild簡介MSBuild是一種基于XML的構(gòu)建引擎,用于在.NET Framework和.NET Core應(yīng)用程序中自動化構(gòu)建過程。它是Visual Studio的構(gòu)建引擎,可在命令行或其他構(gòu)建工具中使用
  • Python異步IO編程的進程/線程通信實現(xiàn)

    這篇文章再講3種方式,同時講4中進程間通信的方式一、 Python 中線程間通信的實現(xiàn)方式共享變量共享變量是多個線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • 零售大模型“干中學(xué)”,攀爬數(shù)字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對于絕大多數(shù)登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標。攀登珠峰的商業(yè)路線有兩條,一是尼泊爾境內(nèi)的南坡路線,一是中國境內(nèi)的北坡路線。相
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業(yè) 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁&ldquo;充值中心&rdquo;入口上線了本機生活界面。壹覽商業(yè)發(fā)現(xiàn),該界面目前主要
  • 新電商三兄弟,“抖快紅”成團!

    來源:價值研究所作 者:Hernanderz 隨著內(nèi)容電商的概念興起,抖音、快手、小紅書組成的&ldquo;新電商三兄弟&rdquo;成為業(yè)內(nèi)一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • iQOO Neo8系列今日官宣:首發(fā)天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯(lián)發(fā)科新一代旗艦芯片天璣9200+的發(fā)布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發(fā)搭載這款當前性能最強大的移動平臺
  • OPPO K11樣張首曝:千元機影像“卷”得真不錯!

    一直以來,OPPO K系列機型都保持著較為均衡的產(chǎn)品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
Top