日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

java的線程池有幾種 java線程的創(chuàng)建方式( 二 )


  1. 內(nèi)存池(Memory Pooling):預先申請內(nèi)存 , 提升申請內(nèi)存速度 , 減少內(nèi)存碎片 。
  2. 連接池(Connection Pooling):預先申請數(shù)據(jù)庫連接 , 提升申請連接的速度 , 降低系統(tǒng)的開銷 。
  3. 實例池(Object Pooling):循環(huán)使用對象 , 減少資源在初始化和釋放時的昂貴損耗 。
在了解完“是什么”和“為什么”之后 , 下面我們來一起深入一下線程池的內(nèi)部實現(xiàn)原理 。
二、線程池核心設計與實現(xiàn)在前文中 , 我們了解到:線程池是一種通過“池化”思想 , 幫助我們管理線程而獲取并發(fā)性的工具 , 在Java中的體現(xiàn)是ThreadPoolExecutor類 。那么它的的詳細設計與實現(xiàn)是什么樣的呢?我們會在本章進行詳細介紹 。
2.1 總體設計
Java中的線程池核心實現(xiàn)類是ThreadPoolExecutor , 本章基于JDK 1.8的源碼來分析Java線程池的核心設計與實現(xiàn) 。我們首先來看一下ThreadPoolExecutor的UML類圖 , 了解下ThreadPoolExecutor的繼承關系 。
java的線程池有幾種 java線程的創(chuàng)建方式


圖1 ThreadPoolExecutor UML類圖
ThreadPoolExecutor實現(xiàn)的頂層接口是Executor , 頂層接口Executor提供了一種思想:將任務提交和任務執(zhí)行進行解耦 。用戶無需關注如何創(chuàng)建線程 , 如何調(diào)度線程來執(zhí)行任務 , 用戶只需提供Runnable對象 , 將任務的運行邏輯提交到執(zhí)行器(Executor)中 , 由Executor框架完成線程的調(diào)配和任務的執(zhí)行部分 。ExecutorService接口增加了一些能力:(1)擴充執(zhí)行任務的能力 , 補充可以為一個或一批異步任務生成Future的方法;(2)提供了管控線程池的方法 , 比如停止線程池的運行 。
AbstractExecutorService則是上層的抽象類 , 將執(zhí)行任務的流程串聯(lián)了起來 , 保證下層的實現(xiàn)只需關注一個執(zhí)行任務的方法即可 。最下層的實現(xiàn)類ThreadPoolExecutor實現(xiàn)最復雜的運行部分 , ThreadPoolExecutor將會一方面維護自身的生命周期 , 另一方面同時管理線程和任務 , 使兩者良好的結(jié)合從而執(zhí)行并行任務 。
ThreadPoolExecutor是如何運行 , 如何同時維護線程和執(zhí)行任務的呢?其運行機制如下圖所示:
java的線程池有幾種 java線程的創(chuàng)建方式


圖2 ThreadPoolExecutor運行流程
線程池在內(nèi)部實際上構(gòu)建了一個生產(chǎn)者消費者模型 , 將線程和任務兩者解耦 , 并不直接關聯(lián) , 從而良好的緩沖任務 , 復用線程 。線程池的運行主要分成兩部分:任務管理、線程管理 。任務管理部分充當生產(chǎn)者的角色 , 當任務提交后 , 線程池會判斷該任務后續(xù)的流轉(zhuǎn):(1)直接申請線程執(zhí)行該任務;(2)緩沖到隊列中等待線程執(zhí)行;(3)拒絕該任務 。線程管理部分是消費者 , 它們被統(tǒng)一維護在線程池內(nèi) , 根據(jù)任務請求進行線程的分配 , 當線程執(zhí)行完任務后則會繼續(xù)獲取新的任務去執(zhí)行 , 最終當線程獲取不到任務的時候 , 線程就會被回收 。
接下來 , 我們會按照以下三個部分去詳細講解線程池運行機制:
  1. 線程池如何維護自身狀態(tài) 。
  2. 線程池如何管理任務 。
  3. 線程池如何管理線程 。
2.2 生命周期管理
線程池運行的狀態(tài) , 并不是用戶顯式設置的 , 而是伴隨著線程池的運行 , 由內(nèi)部來維護 。線程池內(nèi)部使用一個變量維護兩個值:運行狀態(tài)(runState)和線程數(shù)量 (workerCount) 。在具體實現(xiàn)中 , 線程池將運行狀態(tài)(runState)、線程數(shù)量 (workerCount)兩個關鍵參數(shù)的維護放在了一起 , 如下代碼所示:

推薦閱讀