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

Java并發(fā)線程之線程池的知識總結(jié)

 更新時間:2021年01月26日 08:44:07   作者:入門小站  
這篇文章主要介紹了Java并發(fā)線程之線程池的知識總結(jié),幫助大家更好的理解和學習Java并發(fā)線程的相關(guān)內(nèi)容,感興趣的朋友可以了解下

初始化線程池后,把任務丟進去,等待調(diào)度就可以了,使用起來比較方便。
JAVA中Thread是線程類,不建議直接使用Thread執(zhí)行任務,在并發(fā)數(shù)量比較多的情況下,每個線程都是執(zhí)行一個很短的時間就任務結(jié)束了,這樣頻繁創(chuàng)建線程會大大降低系統(tǒng)的效率,因為頻繁的創(chuàng)建和銷毀線程需要時間。而線程池可以復用,就是執(zhí)行完一個任務,并不銷毀,而是可以繼續(xù)執(zhí)行其它任務。

Thread的弊端

  • 每次new Thread() 創(chuàng)建對象,性能差。
  • 線程缺乏統(tǒng)一管理,可能無限制創(chuàng)建線程,相互競爭,有可能占用過多系統(tǒng)資源導致死機或OOM。
  • 不能多執(zhí)行,定期執(zhí)行,線程中斷

線程池的優(yōu)點

  • 重用存在的線程,減少對象創(chuàng)建,消亡的開銷,性能佳,降低資源消耗。
  • 可以控制最大并發(fā)線程數(shù),提高系統(tǒng)資源利用率,同時避免過多資源競爭,避免阻塞,提高響應速度。
  • 提供定時執(zhí)行,定期執(zhí)行,單線程,并發(fā)數(shù)控制等功能,以提高線程的可管理性。

阿里發(fā)布的 Java 開發(fā)手冊中強制線程池不允許使用 Executors 去創(chuàng)建,而是通過 ThreadPoolExecutor 的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規(guī)則,規(guī)避資源耗盡的風險。
Executors利用工廠模式向我們提供了4種線程池實現(xiàn)方式,但是并不推薦使用,原因是使用Executors創(chuàng)建線程池不會傳入相關(guān)參數(shù)而使用默認值所以我們常常忽略了那些重要的參數(shù)(線程池大小、緩沖隊列的類型等),而且默認使用的參數(shù)會導致資源浪費,不可取。

ThreadPoolExecutor介紹

構(gòu)造函數(shù)和參數(shù)

java.uitl.concurrent.ThreadPoolExecutor類是線程池中最核心的一個類。

public class ThreadPoolExecutor extends AbstractExecutorService {
 /** 構(gòu)造函數(shù) 1 */
 public ThreadPoolExecutor(int corePoolSize,
        int maximumPoolSize,
        long keepAliveTime,
        TimeUnit unit,
        BlockingQueue<Runnable> workQueue) {}
        
 /** 構(gòu)造函數(shù) 2 */
 public ThreadPoolExecutor(int corePoolSize,
        int maximumPoolSize,
        long keepAliveTime,
        TimeUnit unit,
        BlockingQueue<Runnable> workQueue,
        ThreadFactory threadFactory) {}
        
 /** 構(gòu)造函數(shù) 3 */
 public ThreadPoolExecutor(int corePoolSize,
        int maximumPoolSize,
        long keepAliveTime,
        TimeUnit unit,
        BlockingQueue<Runnable> workQueue,
        RejectedExecutionHandler handler) {}
        
 /** 構(gòu)造函數(shù) 4 */
 public ThreadPoolExecutor(int corePoolSize,
        int maximumPoolSize,
        long keepAliveTime,
        TimeUnit unit,
        BlockingQueue<Runnable> workQueue,
        ThreadFactory threadFactory,
        RejectedExecutionHandler handler) {}
}

ThreadPoolExecutor類中提供了四個構(gòu)造方法,在構(gòu)造函數(shù)4中,參數(shù)最多,通過觀察其他3個構(gòu)造函數(shù),發(fā)現(xiàn)前面三個構(gòu)造器都是調(diào)用的第四個構(gòu)造器進行的初始化工作。

構(gòu)造器中各個參數(shù)的含義

corePoolSize 核心線程池的大小,在創(chuàng)建了線程池后,默認情況下,線程池中沒有任何的線程池,而是等任務過來了再去創(chuàng)建線程執(zhí)行任務。除非調(diào)用了預創(chuàng)建線程的方法,即在沒有任務到來之前就創(chuàng)建corePoolSize個線程或者一個線程。當線程池中的線程數(shù)量到達corePoolSize后,就會把到達的任務放到緩存隊列里面。

  • prestartCoreThread() : 預創(chuàng)建一個核心線程,使其閑置等待工作。
  • prestartAllCoreThreads() : 啟動所有核心線程,導致它們空閑地等待工作。

maxnumPoolSize 線程池中最大的線程數(shù),是一個非常重要的參數(shù),它表示在線程池中最多能創(chuàng)建多少線程。
keepAliveTime 表示線程在沒有任務執(zhí)行時最多保持多久時間會終止。默認情況下,只有當線程池中的線程數(shù)大于corePoolSize時,keepAliveTime才會起作用,即當線程池中的線程數(shù)大于corePoolSize,如果一個線程的空閑時間達到keepAliveTime,則會終止直到線程池中的線程數(shù)量不大于corePoolSize。但是如果調(diào)用了allowCoreThreadTimeOut(boolean)方法,在線程池中線程數(shù)不大于corePoolSize時,keepAliveTime參數(shù)也會啟作用,直到線程池中的線程數(shù)為0。

unit 參數(shù)keepAliveTime的時間單位,有7種取值,在TimeUnit類中有7種靜態(tài)屬性。

  • TimeUnit.DAYS : 以 天 為單位 ;
  • TimeUnit.HOURS : 以 小時 為單位 ;
  • TimeUnit.MINUTES : 以 分鐘 為單位 ;
  • TimeUnit.SECONDS : 以 秒 為單位 ;
  • TimeUnit.MILLISECONDS : 以 毫秒 為單位 ;
  • TimeUnit.MICROSECONDS : 以 微秒 為單位 ;
  • TimeUnit.NANOSECONDS : 以 納秒 為單位 ;

workQueue一個阻塞隊列,用來存儲等待執(zhí)行的任務,這個參數(shù)的選擇也很重要,會對線程池的運行過程產(chǎn)生重大影響,一般有以下幾種選擇。

  • ArrayBlockingQueue:基于數(shù)組的先進先出隊列,創(chuàng)建時必須指定大小。
  • LinkedBlockingQueue:基于鏈表的先進先出隊列,若果創(chuàng)建時沒有指定此隊列的大小,則默認為Integer.MAX_VALUE
  • SynchronousQueue:這個隊列比較特殊,它不會保存提交的任務,而是直接新建一個線程來執(zhí)行新的任務。

threadFactory線程工廠,主要用來創(chuàng)建線程。線程池最重要的一項工作,就是在滿足某些條件情況下創(chuàng)建線程。在ThreadPoolExecutor線程池中,創(chuàng)建線程的操作時交給ThreadFactoty來完成。使用線程池,就必須要指定threadFactory。如果我們的構(gòu)造器中沒有指定使用ThreadFactory,這個時候ThreadPoolExecutor就會使用默認的ThreadFactory:DefaultThreadFactory
handler 在ThreadPoolExecutor線程池中還有一個重要的接口:RejectedExecutionHandler。當提交給線程池的某一個新任務無法直接被線程池中“核心線程”直接處理,又無法加入等待隊列,也無法創(chuàng)建新的線程執(zhí)行;又或者線程池已經(jīng)調(diào)用shutdown()方法停止了工作;又或者線程池不是處于正常的工作狀態(tài);這時候ThreadPoolExecutor線程池會拒絕處理這個任務,觸發(fā)創(chuàng)建ThreadPoolExecutor線程池時定義的RejectedExecutionHandler接口的實現(xiàn),表示當拒絕處理任務時的策略,有以下四種取值,四種值都為其靜態(tài)內(nèi)部類:

  • ThreadPoolExecutor.AbortPolicy:丟棄任務并拋出RejectedExecutionException異常
  • ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不拋出異常。
  • ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,然后重新嘗試執(zhí)行新提交的任務。

ThreadPoolExecutor執(zhí)行execute方法分下面4種情況

  • 如果當前運行的線程少于corePoolSize,則創(chuàng)建新的線程來執(zhí)行任務(執(zhí)行這一步驟需要獲取全局鎖)
  • 如果運行的線程等于或者多于corePoolSize,則將任務加入到BlockingQueue
  • 如果無法將任務加入BlockingQueue(隊列已滿),則創(chuàng)建新的線程來處理任務(執(zhí)行這一步驟需要獲取全局鎖)
  • 如果創(chuàng)建新線程將當前運行的線程超出maxnumPoolSize,任務被拒絕,并調(diào)用RejectedExecutionHandler.rejectedExecution()方法。

以上就是Java并發(fā)線程之線程池的知識總結(jié)的詳細內(nèi)容,更多關(guān)于Java 線程池的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MybatisPlus查詢條件為空字符串或null問題及解決

    MybatisPlus查詢條件為空字符串或null問題及解決

    這篇文章主要介紹了MybatisPlus查詢條件為空字符串或null問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 解決mybatis-plus-boot-starter與mybatis-spring-boot-starter的錯誤問題

    解決mybatis-plus-boot-starter與mybatis-spring-boot-starter的錯誤問題

    本文主要講述了在使用MyBatis和MyBatis-Plus時遇到的綁定異常問題,通過排查和總結(jié),作者發(fā)現(xiàn)使用MyBatis-Plus?Boot?Starter可以解決這個問題,文章詳細對比了MyBatis-Plus?Boot?Starter和MyBatis?Spring?Boot?Starter的功能和使用場景
    2025-01-01
  • java程序設計語言的優(yōu)勢及特點

    java程序設計語言的優(yōu)勢及特點

    在本篇文章里小編給大家分享的是一篇關(guān)于java程序設計語言的優(yōu)勢及特點的內(nèi)容,需要的朋友們可以學習參考下。
    2020-02-02
  • Java中弱引用和軟引用的區(qū)別以及虛引用和強引用介紹

    Java中弱引用和軟引用的區(qū)別以及虛引用和強引用介紹

    很早Java API就添加了弱引用(WeakReference)和軟引用(SoftReference),但并不是所有的程序員都熟悉這兩個概念
    2014-04-04
  • 淺談幾種Java自定義異常處理方式

    淺談幾種Java自定義異常處理方式

    在Java中,異常是一種常見的處理機制,本文主要介紹了淺談幾種Java自定義異常處理方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • 通過實例學習Spring @Required注釋原理

    通過實例學習Spring @Required注釋原理

    這篇文章主要介紹了通過實例學習Spring @Required注釋原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 詳解Spring-boot中讀取config配置文件的兩種方式

    詳解Spring-boot中讀取config配置文件的兩種方式

    這篇文章主要介紹了詳解Spring-boot中讀取config配置文件的兩種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 利用java實現(xiàn)一個客戶信息管理系統(tǒng)

    利用java實現(xiàn)一個客戶信息管理系統(tǒng)

    這篇文章主要給大家介紹了關(guān)于利用java實現(xiàn)一個客戶信息管理系統(tǒng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • springMVC導出word模板的方法

    springMVC導出word模板的方法

    這篇文章主要為大家詳細介紹了springMVC導出word模板的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • idea如何解決maven依賴沖突

    idea如何解決maven依賴沖突

    這篇文章主要介紹了idea如何解決maven依賴沖突問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論

宁波市| 镇雄县| 临漳县| 余姚市| 玛纳斯县| 介休市| 阜平县| 比如县| 香格里拉县| 呈贡县| 辽阳县| 榆林市| 尖扎县| 毕节市| 双辽市| 南雄市| 兴城市| 晋中市| 将乐县| 上饶市| 固原市| 利辛县| 安乡县| 石景山区| 辽阳县| 灌南县| 临朐县| 东明县| 陵水| 无为县| 安丘市| 九江县| 山西省| 碌曲县| 克什克腾旗| 汉川市| 大埔区| 定安县| 玛沁县| 阳西县| 上饶县|