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

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


Worker執(zhí)行任務(wù)的模型如下圖所示:

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


圖7 Worker執(zhí)行任務(wù)
線程池需要管理線程的生命周期 , 需要在線程長(zhǎng)時(shí)間不運(yùn)行的時(shí)候進(jìn)行回收 。線程池使用一張Hash表去持有線程的引用 , 這樣可以通過添加引用、移除引用這樣的操作來控制線程的生命周期 。這個(gè)時(shí)候重要的就是如何判斷線程是否在運(yùn)行 。
Worker是通過繼承AQS , 使用AQS來實(shí)現(xiàn)獨(dú)占鎖這個(gè)功能 。沒有使用可重入鎖ReentrantLock , 而是使用AQS , 為的就是實(shí)現(xiàn)不可重入的特性去反應(yīng)線程現(xiàn)在的執(zhí)行狀態(tài) 。
  1. lock方法一旦獲取了獨(dú)占鎖 , 表示當(dāng)前線程正在執(zhí)行任務(wù)中 。
  2. 如果正在執(zhí)行任務(wù) , 則不應(yīng)該中斷線程 。
  3. 如果該線程現(xiàn)在不是獨(dú)占鎖的狀態(tài) , 也就是空閑的狀態(tài) , 說明它沒有在處理任務(wù) , 這時(shí)可以對(duì)該線程進(jìn)行中斷 。
  4. 線程池在執(zhí)行shutdown方法或tryTerminate方法時(shí)會(huì)調(diào)用interruptIdleWorkers方法來中斷空閑的線程 , interruptIdleWorkers方法會(huì)使用tryLock方法來判斷線程池中的線程是否是空閑狀態(tài);如果線程是空閑狀態(tài)則可以安全回收 。
在線程回收過程中就使用到了這種特性 , 回收過程如下圖所示:
java的線程池有幾種 java線程的創(chuàng)建方式


圖8 線程池回收過程
2.4.2 Worker線程增加
增加線程是通過線程池中的addWorker方法 , 該方法的功能就是增加一個(gè)線程 , 該方法不考慮線程池是在哪個(gè)階段增加的該線程 , 這個(gè)分配線程的策略是在上個(gè)步驟完成的 , 該步驟僅僅完成增加線程 , 并使它運(yùn)行 , 最后返回是否成功這個(gè)結(jié)果 。addWorker方法有兩個(gè)參數(shù):firstTask、core 。firstTask參數(shù)用于指定新增的線程執(zhí)行的第一個(gè)任務(wù) , 該參數(shù)可以為空;core參數(shù)為true表示在新增線程時(shí)會(huì)判斷當(dāng)前活動(dòng)線程數(shù)是否少于corePoolSize , false表示新增線程前需要判斷當(dāng)前活動(dòng)線程數(shù)是否少于maximumPoolSize , 其執(zhí)行流程如下圖所示:
java的線程池有幾種 java線程的創(chuàng)建方式


圖9 申請(qǐng)線程執(zhí)行流程圖
2.4.3 Worker線程回收
線程池中線程的銷毀依賴JVM自動(dòng)的回收 , 線程池做的工作是根據(jù)當(dāng)前線程池的狀態(tài)維護(hù)一定數(shù)量的線程引用 , 防止這部分線程被JVM回收 , 當(dāng)線程池決定哪些線程需要回收時(shí) , 只需要將其引用消除即可 。Worker被創(chuàng)建出來后 , 就會(huì)不斷地進(jìn)行輪詢 , 然后獲取任務(wù)去執(zhí)行 , 核心線程可以無(wú)限等待獲取任務(wù) , 非核心線程要限時(shí)獲取任務(wù) 。當(dāng)Worker無(wú)法獲取到任務(wù) , 也就是獲取的任務(wù)為空時(shí) , 循環(huán)會(huì)結(jié)束 , Worker會(huì)主動(dòng)消除自身在線程池內(nèi)的引用 。
try{while(task!=null||(task=getTask())!=null){//執(zhí)行任務(wù)}}finally{processWorkerExit(w,completedAbruptly);//獲取不到任務(wù)時(shí) , 主動(dòng)回收自己}線程回收的工作是在processWorkerExit方法完成的 。
java的線程池有幾種 java線程的創(chuàng)建方式


圖10 線程銷毀流程
事實(shí)上 , 在這個(gè)方法中 , 將線程引用移出線程池就已經(jīng)結(jié)束了線程銷毀的部分 。但由于引起線程銷毀的可能性有很多 , 線程池還要判斷是什么引發(fā)了這次銷毀 , 是否要改變線程池的現(xiàn)階段狀態(tài) , 是否要根據(jù)新狀態(tài) , 重新分配線程 。

推薦閱讀