最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的線程池ThreadPoolExecutor解析

 更新時(shí)間:2023年11月08日 09:41:01   作者:你就像甜甜的益達(dá)  
這篇文章主要介紹了Java中的線程池ThreadPoolExecutor解析,線程池,thread pool,是一種線程使用模式,線程池維護(hù)著多個(gè)線程,等待著監(jiān)督管理者分配可并發(fā)執(zhí)行的任務(wù),需要的朋友可以參考下

線程池

針對各種池子,比如

  • 連接池:用于管理和重復(fù)使用數(shù)據(jù)庫連接,避免頻繁創(chuàng)建和銷毀數(shù)據(jù)庫連接帶來的性能開銷。
  • 對象池:用于管理和重復(fù)使用對象,避免頻繁創(chuàng)建和銷毀對象帶來的性能開銷。
  • 字符串池:用于管理和重復(fù)使用字符串,避免頻繁創(chuàng)建和銷毀字符串帶來的性能開銷。
  • 線程池的話也是一樣的,用于管理和重復(fù)使用線程,避免頻繁創(chuàng)建和銷毀線程帶來的性能開銷。
  • 而線程池的工作原理就是相當(dāng)于把任務(wù)提交到一個(gè)阻塞隊(duì)列里面,如何線程去阻塞隊(duì)列里面拿到任務(wù)去執(zhí)行.

ThreadPoolExecutor詳解

首先看看UML圖:

image.png

可以看到最頂層的接口是Executor,就是線程池的頂層接口,線程池的作用就是執(zhí)行方法,而Executor方法里面就一個(gè)方法: void execute(Runnable command); 這個(gè)方法就是線程池最主要的方法,執(zhí)行runnable任務(wù),然后ExecutorService又對線程池的功能進(jìn)行了加強(qiáng),比如可以進(jìn)行管理線程池,且提供了執(zhí)行任務(wù)的能力,比如執(zhí)行異步返回Future結(jié)果的方法,執(zhí)行多個(gè)任務(wù)的方法;

ThreadPoolExecutor參數(shù)詳解

最主要的構(gòu)造方法:

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }
  • int corePoolSize 核心線程數(shù)(一般為cpu數(shù)Runtime.getRuntime().availableProcessors())
  • int maximumPoolSize 最大線程數(shù)(一般為cpu數(shù)*2)
  • long keepAliveTime 存活的時(shí)長(<最大線程數(shù),<核心線程數(shù)的)
  • TimeUnit 時(shí)間單位
  • BlockingQueue workQueue 工作隊(duì)列
  • ThreadFactory threadFactory 線程工廠,創(chuàng)建線程的地方
  • RejectedExecutionHandler handler 拒絕策略
  • 需要注意的是,maximumPoolSize 是當(dāng)線程隊(duì)列滿了,且核心線程都在執(zhí)行中的時(shí)候,再提交任務(wù),就不會放到隊(duì)列里面,只會新建線程執(zhí)行,如果線程數(shù)量等于了最大線程數(shù)的時(shí)候,就會走對應(yīng)的拒絕策略,如果任務(wù)執(zhí)行完,過期時(shí)間才會對新增線程有效,當(dāng)然有個(gè)方法allowCoreThreadTimeOut,讓核心線程也可以過期(一般不會設(shè)置的),一般工作隊(duì)列不會設(shè)置為無限隊(duì)列,因?yàn)槿绻?duì)列無限長可能會造成oom,且最大線程數(shù)就沒用了.

創(chuàng)建線程池的工具類Executors

  • newFixedThreadPool

創(chuàng)建固定大小的線程池。核心數(shù)和最大數(shù)是一樣的,任務(wù)如果過多會在隊(duì)列中阻塞.如果某個(gè)線程因?yàn)閳?zhí)行異常而結(jié)束,那么線程池會補(bǔ)充一個(gè)新線程。

  • newWorkStealingPool

1.8新加的線程池,forkJoinPool 可以根據(jù)CPU的核數(shù)并行的執(zhí)行,適合使用在很耗時(shí)的操作,可以充分的利用CPU執(zhí)行任務(wù),任務(wù)竊取線程池,不保證執(zhí)行順序,適合任務(wù)耗時(shí)差異較大。線程池中有多個(gè)線程隊(duì)列,有的線程隊(duì)列中有大量的比較耗時(shí)的任務(wù)堆積,而有的線程隊(duì)列卻是空的,就存在有的線程處于饑餓狀態(tài),當(dāng)一個(gè)線程處于饑餓狀態(tài)時(shí),它就會去其它的線程隊(duì)列中竊取任務(wù)。解決饑餓導(dǎo)致的效率問題。

默認(rèn)創(chuàng)建的并行 level 是 CPU 的核數(shù)。主線程結(jié)束,即使線程池有任務(wù)也會立即停止。

  • newSingleThreadExecutor

創(chuàng)建一個(gè)單線程的線程池。這個(gè)線程池的核心數(shù)和最大數(shù)都是1,也就是相當(dāng)于單線程串行執(zhí)行所有任務(wù)。如果這個(gè)唯一的線程因?yàn)楫惓=Y(jié)束,那么會有一個(gè)新的線程來替代它。此線程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行。

  • newCachedThreadPool

創(chuàng)建一個(gè)可緩存的線程池。核心數(shù)是0,最大數(shù)是 Integer.MAX_VALUE,如果一下子任務(wù)很多,且執(zhí)行時(shí)間長,容易發(fā)生異常,堆溢出,且執(zhí)行效率降低,并不是線程數(shù)目越多,執(zhí)行越快的,如果線程池的大小超過了處理任務(wù)所需要的線程,那么就會回收部分空閑(60秒不執(zhí)行任務(wù))的線程,當(dāng)任務(wù)數(shù)增加時(shí),此線程池又可以智能的添加新線程來處理任務(wù)。此線程池不會對線程池大小做限制,線程池大小完全依賴于操作系統(tǒng)(或者說JVM)能夠創(chuàng)建的最大線程大小。

  • newScheduledThreadPool

支持周期性任務(wù)的調(diào)度。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。按道理來說線程池的最大數(shù)是 Integer.MAX_VALUE,但是,線程數(shù)并不會超過核心數(shù)…是固定長度的.

這些方法基本都是創(chuàng)建ThreadPoolExecutor,或者繼承ThreadPoolExecutor,對其進(jìn)行增強(qiáng).

任務(wù)拒絕策略

默認(rèn)的拒絕策略是AbortPolicy,直接拋出異常

    private static final RejectedExecutionHandler defaultHandler =
        new AbortPolicy();

public static class AbortPolicy implements RejectedExecutionHandler {
        /**
         * Creates an {@code AbortPolicy}.
         */
        public AbortPolicy() { }

        /**
         * Always throws RejectedExecutionException.
         *
         * @param r the runnable task requested to be executed
         * @param e the executor attempting to execute this task
         * @throws RejectedExecutionException always
         */
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            throw new RejectedExecutionException("Task " + r.toString() +
                                                 " rejected from " +
                                                 e.toString());
        }
    }

ThreadPoolExecutor.AbortPolicy 丟棄任務(wù)并且拋出- RejectedExecutionException異常。在任務(wù)不能提交的時(shí)候,拋出異常,及時(shí)反饋程序運(yùn)行狀態(tài)。如果是比較關(guān)鍵的業(yè)務(wù),推薦使用此拒絕策略,這樣子在系統(tǒng)不能承受更大的并發(fā)量的時(shí)候,能夠及時(shí)通過異常發(fā)現(xiàn)。

ThreadPoolExecutor.DiscardPolicy 丟棄任務(wù),但是不拋出異常。使用此策略,可能會使我們無法發(fā)現(xiàn)系統(tǒng)的異常狀態(tài)。建議是一些無關(guān)緊要的業(yè)務(wù)采用此策略。

ThreadPoolExecutor.DiscardOldestPolicy 丟棄隊(duì)列最前面的任務(wù),然后重新提交被拒絕的任務(wù)。

ThreadPoolExecutor.CallerRunsPolicy 由調(diào)用線程(提交任務(wù)的線程)處理該任務(wù)。這種情況是需要讓所有任務(wù)都執(zhí)行完畢,那么就適合大量計(jì)算的任務(wù)類型去執(zhí)行,多線程僅僅是增大吞吐量的手段,最終必須要讓每個(gè)任務(wù)都執(zhí)行完畢。

到此這篇關(guān)于Java中的線程池ThreadPoolExecutor解析的文章就介紹到這了,更多相關(guān)Java的ThreadPoolExecutor內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 舉例講解Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用

    舉例講解Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用,裝飾者模式就是給一個(gè)對象動(dòng)態(tài)的添加新的功能,裝飾者和被裝飾者實(shí)現(xiàn)同一個(gè)接口,裝飾者持有被裝飾者的實(shí)例,需要的朋友可以參考下
    2016-05-05
  • Java后端向前端推送消息完整代碼實(shí)例

    Java后端向前端推送消息完整代碼實(shí)例

    WebSocket是一種全雙工通信協(xié)議,允許后端主動(dòng)向前端推送消息,下面這篇文章主要介紹了Java后端向前端推送消息的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-02-02
  • Java頻繁創(chuàng)建線程排查和解決方案

    Java頻繁創(chuàng)建線程排查和解決方案

    文章討論了Java線程池的使用和配置,以及線程對內(nèi)存的影響,作者通過實(shí)驗(yàn)和理論分析,指出線程并不是占用JVM的內(nèi)存,而是由操作系統(tǒng)分配的本地線程,文章還提到了線程池的優(yōu)點(diǎn),如節(jié)省系統(tǒng)開銷、提高性能和方便控制
    2025-02-02
  • java 文件名截取方法

    java 文件名截取方法

    在實(shí)際開發(fā)應(yīng)用中會應(yīng)到截取文件名,本文將介紹java中文件名的截取,需要了解的朋友可以參考下
    2012-11-11
  • SpringBoot如何實(shí)現(xiàn)并發(fā)任務(wù)并返回結(jié)果

    SpringBoot如何實(shí)現(xiàn)并發(fā)任務(wù)并返回結(jié)果

    這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)并發(fā)任務(wù)并返回結(jié)果問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Activiti進(jìn)階之組任務(wù)實(shí)現(xiàn)示例詳解

    Activiti進(jìn)階之組任務(wù)實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了Activiti進(jìn)階之組任務(wù)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • javaWeb使用Kaptcha組件生成驗(yàn)證碼

    javaWeb使用Kaptcha組件生成驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了javaWeb使用Kaptcha組件生成驗(yàn)證碼的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • java中i18n的properties的亂碼問題及解決思路

    java中i18n的properties的亂碼問題及解決思路

    解決java后臺返回給前端的500信息亂碼問題,通過開啟IDEA的Transparent native-to-ascii conversion編碼,使讀取i18n配置文件的信息顯示正常,此方法僅供參考
    2026-05-05
  • 在SpringBoot中該如何配置攔截器

    在SpringBoot中該如何配置攔截器

    今天給大家?guī)淼氖顷P(guān)于SpringBoot的相關(guān)知識,文章圍繞在SpringBoot中該如何配置攔截器展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java中的HashMap實(shí)現(xiàn)原理深入理解

    Java中的HashMap實(shí)現(xiàn)原理深入理解

    HashMap是一種非常常見和實(shí)用的數(shù)據(jù)結(jié)構(gòu),它被廣泛應(yīng)用于Java編程中,這篇文章主要介紹了Java中HashMap實(shí)現(xiàn)原理的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-12-12

最新評論

宁德市| 英德市| 旬阳县| 颍上县| 师宗县| 潢川县| 友谊县| 万源市| 扎赉特旗| 凌源市| 平塘县| 雷州市| 佳木斯市| 城固县| 河南省| 汕尾市| 寿宁县| 甘泉县| 福建省| 城固县| 昌江| 公主岭市| 中西区| 沂源县| 旺苍县| 云南省| 越西县| 剑川县| 兴安盟| 新绛县| 神池县| 青川县| 夏邑县| 南平市| 巨鹿县| 甘德县| 清徐县| 博湖县| 永德县| 夏邑县| 咸丰县|