【Android 异步操作】线程池 ( 线程池作用 | 线程池种类 | 线程池工作机制 | 线程池任务调度源码解析 )
文章目錄
- 一、線程池作用
- 二、線程池種類
- 三、線程池工作機(jī)制
- 四、線程池任務(wù)調(diào)度源碼解析
一、線程池作用
線程池作用 :
① 避免創(chuàng)建線程 : 避免每次使用線程時(shí) , 都需要 創(chuàng)建線程對(duì)象 ;
② 統(tǒng)一管理 : 統(tǒng)一管理線程 , 重用存在的線程 , 減少線程對(duì)象創(chuàng)建 , 銷毀的開銷 ;
③ 控制并發(fā) : 可 控制線程的最大并發(fā)數(shù) , 提高資源使用效率 , 避免資源競(jìng)爭(zhēng)導(dǎo)致堵塞 ;
二、線程池種類
線程池種類 :
① newCachedThreadPool : 可緩存線程池 , 如果 線程池線程個(gè)數(shù)已滿 , 回收空閑線程 , 如果沒有空閑線程 , 此時(shí)會(huì)創(chuàng)建新線程 ;
② newFixedThreadPool : 創(chuàng)建固定大小線程池 , 可設(shè)置并發(fā)數(shù) , 如果并發(fā)數(shù)已滿 , 后續(xù)任務(wù)會(huì) 在 等待隊(duì)列 中等待可用線程 ;
③ newScheduledThreadPool : 創(chuàng)建固定大小線程池 , 其支持 周期性任務(wù) ;
④ newSingleThreadExecutor : 創(chuàng)建 單線程 線程池 , 該線程池中 只有一個(gè)線程 , 所有的任務(wù)按照指定的優(yōu)先級(jí)順序執(zhí)行 , 如 FIFO 先入先出 ( 先到的先執(zhí)行 , 后到的后執(zhí)行 ) , LIFO 后入先出 ( 后到的先執(zhí)行 ) ;
三、線程池工作機(jī)制
線程池線程相關(guān)概念:
-
線程數(shù) : 線程池的 有 最大線程數(shù) MaxSzie , 核心線程數(shù) CoreSize , 非核心線程數(shù)就是 MaxSize - CoreSize ;
-
示例 : 最大線程數(shù) ( MaxSize ) 是 8 個(gè) , 有 3 個(gè)核心線程 ( CoreSize ) , 5 個(gè)非核心線程 ;
-
非核心線程 : 閑置超過(guò)一定時(shí)間 , 就會(huì)被回收 ;
線程池任務(wù)調(diào)度 : 線程池中維護(hù)了一個(gè)任務(wù)隊(duì)列 , 線程池啟動(dòng)后 , 會(huì)不停的從任務(wù)隊(duì)列中取出任務(wù) , 如果有新任務(wù) , 執(zhí)行如下操作 ;
如果 線程數(shù) 小于核心線程數(shù) ( CoreSize ) , 那么創(chuàng)建核心線程 , 執(zhí)行上述任務(wù) ;
如果 線程數(shù) 大于核心線程數(shù) ( CoreSize ) , 小于最大線程數(shù) ( MaxSize ) , 那么創(chuàng)建非核心線程 , 執(zhí)行上述任務(wù) ;
如果 線程數(shù) 超過(guò) 最大線程數(shù) ( MaxSize )
- 如果 任務(wù)隊(duì)列沒滿 , 則將任務(wù)放入任務(wù)隊(duì)列 ;
- 如果 任務(wù)隊(duì)列滿了 , 則拋出異常 ; 這里一般情況下需要手動(dòng)處理這種情況 , 任務(wù)拒絕后 , 處理善后 ;
四、線程池任務(wù)調(diào)度源碼解析
在 AsyncTask.java 中 , 在靜態(tài)代碼塊中 , 自己 自定義創(chuàng)建了線程池 , 沒有使用上述四種線程池 ;
創(chuàng)建線程池時(shí)傳入的參數(shù) :
- CORE_POOL_SIZE : 核心線程數(shù)
- MAXIMUM_POOL_SIZE : 最大線程數(shù)
- KEEP_ALIVE_SECONDS : 閑置時(shí)間 , 非核心線程一旦閑置超過(guò)一定時(shí)間 , 就會(huì)被回收
- TimeUnit.SECONDS : 閑置時(shí)間單位 , 秒
- sPoolWorkQueue : 線程隊(duì)列 , 任務(wù)隊(duì)列
- sThreadFactory : 線程工廠 , 用于生產(chǎn)線程
在 AsyncTask 中 , 調(diào)用 ThreadPoolExecutor THREAD_POOL_EXECUTOR 線程池的 void execute(Runnable command) 方法 , 執(zhí)行線程池任務(wù) ;
在 execute 方法中, 需要執(zhí)行以下三個(gè)步驟 :
如果當(dāng)前 運(yùn)行線程數(shù)小于核心線程數(shù) , 嘗試 啟動(dòng)新線程執(zhí)行該任務(wù), 該任務(wù)是線程的第一個(gè)任務(wù).調(diào)用 addWorker 方法會(huì)檢查運(yùn)行狀態(tài), 和線程運(yùn)行個(gè)數(shù), 避免在不應(yīng)該添加線程時(shí)執(zhí)行錯(cuò)誤操作.
如果 任務(wù)成功加入隊(duì)列, 需要 雙重檢查 ( 進(jìn)入該方法后, 線程池可能關(guān)閉 ), 在進(jìn)入該方法后, 是否添加了一個(gè)線程, 或者線程池是否關(guān)閉. 因此, 我們應(yīng)該再次檢查運(yùn)行狀態(tài), 如果需要, 將任務(wù)放回隊(duì)列中, 或者啟動(dòng)一個(gè)新線程.
如果 不能將任務(wù)入隊(duì), 盡量添加一個(gè)新線程. 如果添加失敗, 此時(shí)線程池可能關(guān)閉, 或者運(yùn)行線程數(shù)等于最大線程數(shù), 需要拒絕該任務(wù).
總結(jié)
以上是生活随笔為你收集整理的【Android 异步操作】线程池 ( 线程池作用 | 线程池种类 | 线程池工作机制 | 线程池任务调度源码解析 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【错误记录】Android 应用连接 B
- 下一篇: 【数理逻辑】谓词逻辑 ( 谓词逻辑基本等