欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java的線程池ThreadPoolExecutor及多種線程池實(shí)現(xiàn)詳解

 更新時(shí)間:2024年01月11日 10:43:36   作者:好奇的7號(hào)  
這篇文章主要介紹了Java的線程池ThreadPoolExecutor及多種線程池實(shí)現(xiàn)詳解,ThreadPoolExecutor 使用 int 的高 3 位來(lái)表示線程池狀態(tài),低 29 位表示線程數(shù)量,之所以將信息存儲(chǔ)在一個(gè)變量中,是為了保證原子性,需要的朋友可以參考下

1、線程池狀態(tài)含義

ThreadPoolExecutor 使用 int 的高 3 位來(lái)表示線程池狀態(tài),低 29 位表示線程數(shù)量,之所以將信息存儲(chǔ)在一個(gè)變量中,是為了保證原子性。

具體的高三位與線程池狀態(tài)如下,引用自網(wǎng)課的圖片:

2、構(gòu)造方法的參數(shù)、具體工作方式

public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler)

對(duì)于以上變量,其含義如下:corePoolSize 核心線程數(shù)目 (最多保留的線程數(shù))

  • maximumPoolSize 最大線程數(shù)目
  • keepAliveTime 生存時(shí)間
  • unit 生存時(shí)間的時(shí)間單位
  • workQueue 阻塞隊(duì)列
  • threadFactory 線程工廠 - 可以為線程創(chuàng)建時(shí)起個(gè)好名字
  • handler 拒絕策略

具體解釋:

1.核心線程數(shù):是指在線程池中始終保持存活的線程數(shù)量。在線程池中,當(dāng)有新的任務(wù)到達(dá)時(shí),線程池會(huì)創(chuàng)建新的線程來(lái)處理任務(wù),但是當(dāng)任務(wù)處理完畢后,線程并不會(huì)立即銷毀,而是被放置在線程池中等待下一個(gè)任務(wù)的到來(lái)。 當(dāng)將allowCoreThreadTimeout設(shè)置為 true 時(shí),核心線程也會(huì)超時(shí)回收,像這樣:

executor.allowCoreThreadTimeOut(true); // 允許回收核心線程

2.最大線程數(shù)目:指核心線程數(shù)+非核心線程數(shù)的總數(shù)。例如設(shè)置核心為5,最大為10,那么非核心(救急)則為10-5=5個(gè)

3.生存時(shí)間:線程閑置超時(shí)時(shí)長(zhǎng)。如果超過(guò)該時(shí)長(zhǎng),非核心線程就會(huì)被回收。如果將allowCoreThreadTimeout設(shè)置為 true 時(shí),核心線程也會(huì)超時(shí)回收。

4.阻塞隊(duì)列:如果核心線程都被占用沒(méi)有空閑,此時(shí)又多來(lái)了新任務(wù),則新來(lái)的任務(wù)會(huì)被加入阻塞隊(duì)列阻塞等待。

5.拒絕策略:如果阻塞隊(duì)列滿了,繼續(xù)來(lái)任務(wù),那么就創(chuàng)建救急線程來(lái)執(zhí)行新任務(wù),但如果救急線程也不夠(達(dá)到最大線程數(shù)),再來(lái)任務(wù),因?yàn)榫€程池已經(jīng)填滿了到極限了,所以就要拒絕新來(lái)的任務(wù)了。jdk和各種框架有多種拒絕策略的實(shí)現(xiàn):

  • AbortPolicy 讓調(diào)用者拋出 RejectedExecutionException 異常,這是默認(rèn)策略
  • CallerRunsPolicy 讓調(diào)用者運(yùn)行任務(wù)
  • DiscardPolicy 放棄本次任務(wù)
  • DiscardOldestPolicy 放棄隊(duì)列中最早的任務(wù),本任務(wù)取而代之
  • ActiveMQ 的實(shí)現(xiàn),帶超時(shí)等待(60s)嘗試放入隊(duì)列(較好)

3、線程池有哪些常用的實(shí)現(xiàn)方式

3.1 newFixedThreadPool

全是、多個(gè)核心線程不回收

fixed,即“固定的”,線程數(shù)固定,能夠控制線程的最大并發(fā)數(shù):

(1)源碼中,其核心線程數(shù)和最大線程數(shù)都是nThreads,即相等,說(shuō)明沒(méi)有非核心線程

(2)阻塞隊(duì)列是無(wú)界的,可以放任意數(shù)量的任務(wù)。

(3)核心線程不會(huì)自動(dòng)回收,直到被明確打斷:“The threads in the pool will exist until it is explicitly shutdown.”

public static ExecutorService newFixedThreadPool(int nThreads) {
     return new ThreadPoolExecutor(nThreads, nThreads,
     0L, TimeUnit.MILLISECONDS,
     new LinkedBlockingQueue<Runnable>());
}
//具體使用示例
//1.創(chuàng)建定長(zhǎng)線程池對(duì)象,線程數(shù)量固定為3
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
//2. 創(chuàng)建Runnable線程對(duì)象以及執(zhí)行的任務(wù)
Runnable task =new Runnable(){
  public void run() {
     System.out.println("執(zhí)行任務(wù)啦");
  }
};
//3. 向線程池提交任務(wù)
fixedThreadPool.execute(task);

3.2newCachedThreadPool

全是非核心,定時(shí)回收

Cached,緩存,是說(shuō)這種線程池的實(shí)現(xiàn)像緩存一樣是可變的:

(1)核心線程數(shù)是 0, 最大線程數(shù)是 Integer.MAX_VALUE,線程的空閑生存時(shí)間是 60s,意味著:這種線程池內(nèi)都是非核心線程、可以無(wú)限創(chuàng)建、定時(shí)60s回收。

(2)隊(duì)列采用了 SynchronousQueue ,特點(diǎn)是,它沒(méi)有容量,沒(méi)有線程來(lái)取是放不進(jìn)去的。

(3)適合場(chǎng)景:執(zhí)行大量、耗時(shí)少的任務(wù)。

public static ExecutorService newCachedThreadPool() {
     return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
     60L, TimeUnit.SECONDS,
     new SynchronousQueue<Runnable>());
}

3.3newSingleThreadExecutor

就一個(gè)核心線程,不回收

Single,即單線程的線程池:只有 1 個(gè)核心線程,無(wú)非核心線程,執(zhí)行后不會(huì)立即回收。 這樣相當(dāng)于順序執(zhí)行,不需要處理線程同步問(wèn)題。

public static ExecutorService newSingleThreadExecutor() {
 return new FinalizableDelegatedExecutorService
     (new ThreadPoolExecutor(1, 1,
         0L, TimeUnit.MILLISECONDS,
         new LinkedBlockingQueue<Runnable>()));
}

3.4newScheduledThreadPool

核心非核心都有,非核心定時(shí)回收

Scheduled即定時(shí)的:核心線程數(shù)量固定,非核心線程數(shù)量無(wú)限多但會(huì)定時(shí)回收,當(dāng)非核心線程執(zhí)行完閑置 10ms 后則回收,任務(wù)隊(duì)列為延時(shí)阻塞隊(duì)列。 應(yīng)用場(chǎng)景:執(zhí)行定時(shí)或周期性的任務(wù)。

private static final long DEFAULT_KEEPALIVE_MILLIS = 10L;

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

相關(guān)文章

  • SpringBoot項(xiàng)目執(zhí)行腳本 自動(dòng)拉取最新代碼并重啟的實(shí)例內(nèi)容

    SpringBoot項(xiàng)目執(zhí)行腳本 自動(dòng)拉取最新代碼并重啟的實(shí)例內(nèi)容

    在本篇文章里小編給大家整理的是一篇關(guān)于SpringBoot項(xiàng)目執(zhí)行腳本 自動(dòng)拉取最新代碼并重啟的實(shí)例內(nèi)容,有需要的朋友們參考下。
    2019-12-12
  • springboot druid數(shù)據(jù)庫(kù)連接池連接失敗后一直重連的解決方法

    springboot druid數(shù)據(jù)庫(kù)連接池連接失敗后一直重連的解決方法

    本文主要介紹了springboot druid數(shù)據(jù)庫(kù)連接池連接失敗后一直重連的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • SpringBoot快速過(guò)濾出一次請(qǐng)求的所有日志的示例代碼

    SpringBoot快速過(guò)濾出一次請(qǐng)求的所有日志的示例代碼

    在現(xiàn)網(wǎng)出現(xiàn)故障時(shí),我們經(jīng)常需要獲取一次請(qǐng)求流程里的所有日志進(jìn)行定位,本文給大家介紹了SpringBoot如何快速過(guò)濾出一次請(qǐng)求的所有日志,文中有相關(guān)的代碼和示例供大家參考,需要的朋友可以參考下
    2024-03-03
  • SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分庫(kù)分表

    SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分庫(kù)分表

    本文主要介紹了SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分庫(kù)分表,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • maven插件spring-boot-starter-tomcat的使用方式

    maven插件spring-boot-starter-tomcat的使用方式

    這篇文章主要介紹了maven插件spring-boot-starter-tomcat的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • java在cmd中亂碼的問(wèn)題解決

    java在cmd中亂碼的問(wèn)題解決

    本文深入探討了在使用Java命令行cmd時(shí)可能出現(xiàn)的中文亂碼問(wèn)題,并提供了兩種解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Java面試Socket編程常用參數(shù)設(shè)置源碼問(wèn)題分析

    Java面試Socket編程常用參數(shù)設(shè)置源碼問(wèn)題分析

    這篇文章主要為大家介紹了Java編程中關(guān)于Socket結(jié)構(gòu)分析,常用參數(shù)設(shè)置源碼示例以及面試中的問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03
  • java實(shí)現(xiàn)文件夾解壓和壓縮

    java實(shí)現(xiàn)文件夾解壓和壓縮

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件夾解壓和壓縮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)之HashMap和HashSet

    Java數(shù)據(jù)結(jié)構(gòu)之HashMap和HashSet

    這篇文章主要介紹了HashMap和HashSet,什么是哈希表以及HashMap的部分源碼解讀,想了解更多的小伙伴,可以參考閱讀本文
    2023-03-03
  • SpringBoot整合neo4j使用詳解

    SpringBoot整合neo4j使用詳解

    這篇文章將和大家詳細(xì)聊聊如何在springboot應(yīng)用中集成和使用neo4j,文中有詳細(xì)的實(shí)現(xiàn)流程和實(shí)例代碼,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10

最新評(píng)論