亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁/技術文章
文章詳情頁

java高級應用:線程池的全面講解(干貨)

瀏覽:3日期:2022-08-16 09:25:20

java高級應用:線程池的全面講解(干貨)

什么是線程池?

很簡單,簡單看名字就知道是裝有線程的池子,我們可以把要執行的多線程交給線程池來處理,和連接池的概念一樣,通過維護一定數量的線程池來達到多個線程的復用。

線程池的好處

我們知道不用線程池的話,每個線程都要通過new Thread(xxRunnable).start()的方式來創建并運行一個線程,線程少的話這不會是問題,而真實環境可能會開啟多個線程讓系統和程序達到最佳效率,當線程數達到一定數量就會耗盡系統的CPU和內存資源,也會造成GC頻繁收集和停頓,因為每次創建和銷毀一個線程都是要消耗系統資源的,如果為每個任務都創建線程這無疑是一個很大的性能瓶頸。

所以,線程池中的線程復用極大節省了系統資源,當線程一段時間不再有任務處理時它也會自動銷毀,而不會長駐內存。

線程池核心類

在java.util.concurrent包中我們能找到線程池的定義,其中ThreadPoolExecutor是我們線程池核心類,首先看看線程池類的主要參數有哪些。

java高級應用:線程池的全面講解(干貨)

corePoolSize:線程池的核心大小,也可以理解為最小的線程池大小。

maximumPoolSize:最大線程池大小。

keepAliveTime:空余線程存活時間,指的是超過corePoolSize的空余線程達到多長時間才進行銷毀。

unit:銷毀時間單位。

workQueue:存儲等待執行線程的工作隊列。

threadFactory:創建線程的工廠,一般用默認即可。

handler:拒絕策略,當工作隊列、線程池全已滿時如何拒絕新任務,默認拋出異常。

線程池工作流程

1、如果線程池中的線程小于corePoolSize時就會創建新線程直接執行任務。

2、如果線程池中的線程大于corePoolSize時就會暫時把任務存儲到工作隊列workQueue中等待執行。

3、如果工作隊列workQueue也滿時:當線程數小于最大線程池數maximumPoolSize時就會創建新線程來處理,而線程數大于等于最大線程池數maximumPoolSize時就會執行拒絕策略。

線程池分類

Executors是jdk里面提供的創建線程池的工廠類,它默認提供了4種常用的線程池應用,而不必我們去重復構造。

newFixedThreadPool

固定線程池,核心線程數和最大線程數固定相等,而空閑存活時間為0毫秒,說明此參數也無意義,工作隊列為最大為Integer.MAX_VALUE大小的阻塞隊列。當執行任務時,如果線程都很忙,就會丟到工作隊列等有空閑線程時再執行,隊列滿就執行默認的拒絕策略。

java高級應用:線程池的全面講解(干貨)

newCachedThreadPool

帶緩沖線程池,從構造看核心線程數為0,最大線程數為Integer最大值大小,超過0個的空閑線程在60秒后銷毀,SynchronousQueue這是一個直接提交的隊列,意味著每個新任務都會有線程來執行,如果線程池有可用線程則執行任務,沒有的話就創建一個來執行,線程池中的線程數不確定,一般建議執行速度較快較小的線程,不然這個最大線程池邊界過大容易造成內存溢出。

java高級應用:線程池的全面講解(干貨)

newSingleThreadExecutor

單線程線程池,核心線程數和最大線程數均為1,空閑線程存活0毫秒同樣無意思,意味著每次只執行一個線程,多余的先存儲到工作隊列,一個一個執行,保證了線程的順序執行。

java高級應用:線程池的全面講解(干貨)

newScheduledThreadPool

調度線程池,即按一定的周期執行任務,即定時任務,對ThreadPoolExecutor進行了包裝而已。

java高級應用:線程池的全面講解(干貨)

拒絕策略AbortPolicy

簡單粗暴,直接拋出拒絕異常,這也是默認的拒絕策略。

java高級應用:線程池的全面講解(干貨)

java高級應用:線程池的全面講解(干貨)

CallerRunsPolicy

如果線程池未關閉,則會在調用者線程中直接執行新任務,這會導致主線程提交線程性能變慢。

java高級應用:線程池的全面講解(干貨)

DiscardPolicy

從方法看沒做任務操作,即表示不處理新任務,即丟棄。

java高級應用:線程池的全面講解(干貨)

DiscardOldestPolicy

拋棄最老的任務,就是從隊列取出最老的任務然后放入新的任務進行執行。

java高級應用:線程池的全面講解(干貨)

如何提交線程

如可以先隨便定義一個固定大小的線程池

ExecutorService es = Executors.newFixedThreadPool(3);

提交一個線程

es.submit(xxRunnble);es.execute(xxRunnble);submit和execute分別有什么區別呢?

execute沒有返回值,如果不需要知道線程的結果就使用execute方法,性能會好很多。

submit返回一個Future對象,如果想知道線程結果就使用submit提交,而且它能在主線程中通過Future的get方法捕獲線程中的異常。

如何關閉線程池

es.shutdown();

不再接受新的任務,之前提交的任務等執行結束再關閉線程池。

es.shutdownNow();

不再接受新的任務,試圖停止池中的任務再關閉線程池,返回所有未處理的線程list列表。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Java
相關文章:
主站蜘蛛池模板: 国产a级特黄的片子视频免费 | 黄色一级免费 | 好硬好湿好爽再深一点h视频 | 在线观看 一区二区 麻豆 | 国产大片黄在线看免费 | 在线成人综合色一区 | 欧美操大逼视频 | 伊人色婷婷 | 不卡黄色| 最新精品视频在线观看 | 国产小视频福利 | 艹逼视频免费 | 男女晚上激烈的拍拍拍免费看 | 成人免费国产gav视频在线 | 黄色综合网站 | 韩国三级欧美三级国产三级 | 黄色一级片免费网站 | 免费黄色片网址 | 夜夜夜爽bbbb性视频 | 成人免费一区二区三区 | 欧美精品啪啪 | 九九九热精品 | 欧美一级做a爰片免费 | 国产一区二区三区四区小蝌蚪 | 国内精品福利在线视频 | 亚洲欧美综合一区 | 欧美一区二区三区精品影视 | 免费欧洲毛片a级视频老妇女 | 国产亚洲美女精品久久久久 | 日本亚洲精品久久 | 国产成人精品男人的天堂网站 | 久久精品国产精品青草图片 | 国产亚洲精品一区在线播 | 免费观看三级毛片 | 国产精品亚洲精品不卡 | 国产一区二区三区欧美 | 国偷盗摄自产福利一区在线 | 欧美人在线 | 在线精品国产一区二区 | 国产一区二区在线观看免费 | 亚洲欧美中文在线观看4 |