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

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


privatefinalAtomicIntegerctl=newAtomicInteger(ctlOf(RUNNING,0));ctl這個(gè)AtomicInteger類型 , 是對(duì)線程池的運(yùn)行狀態(tài)和線程池中有效線程的數(shù)量進(jìn)行控制的一個(gè)字段 ,  它同時(shí)包含兩部分的信息:線程池的運(yùn)行狀態(tài) (runState) 和線程池內(nèi)有效線程的數(shù)量 (workerCount) , 高3位保存runState , 低29位保存workerCount , 兩個(gè)變量之間互不干擾 。用一個(gè)變量去存儲(chǔ)兩個(gè)值 , 可避免在做相關(guān)決策時(shí) , 出現(xiàn)不一致的情況 , 不必為了維護(hù)兩者的一致 , 而占用鎖資源 。通過(guò)閱讀線程池源代碼也可以發(fā)現(xiàn) , 經(jīng)常出現(xiàn)要同時(shí)判斷線程池運(yùn)行狀態(tài)和線程數(shù)量的情況 。線程池也提供了若干方法去供用戶獲得線程池當(dāng)前的運(yùn)行狀態(tài)、線程個(gè)數(shù) 。這里都使用的是位運(yùn)算的方式 , 相比于基本運(yùn)算 , 速度也會(huì)快很多 。
關(guān)于內(nèi)部封裝的獲取生命周期狀態(tài)、獲取線程池線程數(shù)量的計(jì)算方法如以下代碼所示:
privatestaticintrunStateOf(intc){returnc&~CAPACITY;}//計(jì)算當(dāng)前運(yùn)行狀態(tài)privatestaticintworkerCountOf(intc){returnc&CAPACITY;}//計(jì)算當(dāng)前線程數(shù)量privatestaticintctlOf(intrs,intwc){returnrs|wc;}//通過(guò)狀態(tài)和線程數(shù)生成ctlThreadPoolExecutor的運(yùn)行狀態(tài)有5種 , 分別為:

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


其生命周期轉(zhuǎn)換如下入所示:
java的線程池有幾種 java線程的創(chuàng)建方式


圖3 線程池生命周期
【java的線程池有幾種 java線程的創(chuàng)建方式】2.3 任務(wù)執(zhí)行機(jī)制
2.3.1 任務(wù)調(diào)度
任務(wù)調(diào)度是線程池的主要入口 , 當(dāng)用戶提交了一個(gè)任務(wù) , 接下來(lái)這個(gè)任務(wù)將如何執(zhí)行都是由這個(gè)階段決定的 。了解這部分就相當(dāng)于了解了線程池的核心運(yùn)行機(jī)制 。
首先 , 所有任務(wù)的調(diào)度都是由execute方法完成的 , 這部分完成的工作是:檢查現(xiàn)在線程池的運(yùn)行狀態(tài)、運(yùn)行線程數(shù)、運(yùn)行策略 , 決定接下來(lái)執(zhí)行的流程 , 是直接申請(qǐng)線程執(zhí)行 , 或是緩沖到隊(duì)列中執(zhí)行 , 亦或是直接拒絕該任務(wù) 。其執(zhí)行過(guò)程如下:
  1. 首先檢測(cè)線程池運(yùn)行狀態(tài) , 如果不是RUNNING , 則直接拒絕 , 線程池要保證在RUNNING的狀態(tài)下執(zhí)行任務(wù) 。
  2. 如果workerCount < corePoolSize , 則創(chuàng)建并啟動(dòng)一個(gè)線程來(lái)執(zhí)行新提交的任務(wù) 。
  3. 如果workerCount >= corePoolSize , 且線程池內(nèi)的阻塞隊(duì)列未滿 , 則將任務(wù)添加到該阻塞隊(duì)列中 。
  4. 如果workerCount >= corePoolSize && workerCount < maximumPoolSize , 且線程池內(nèi)的阻塞隊(duì)列已滿 , 則創(chuàng)建并啟動(dòng)一個(gè)線程來(lái)執(zhí)行新提交的任務(wù) 。
  5. 如果workerCount >= maximumPoolSize , 并且線程池內(nèi)的阻塞隊(duì)列已滿, 則根據(jù)拒絕策略來(lái)處理該任務(wù), 默認(rèn)的處理方式是直接拋異常 。
其執(zhí)行流程如下圖所示:
java的線程池有幾種 java線程的創(chuàng)建方式


圖4 任務(wù)調(diào)度流程
2.3.2 任務(wù)緩沖
任務(wù)緩沖模塊是線程池能夠管理任務(wù)的核心部分 。線程池的本質(zhì)是對(duì)任務(wù)和線程的管理 , 而做到這一點(diǎn)最關(guān)鍵的思想就是將任務(wù)和線程兩者解耦 , 不讓兩者直接關(guān)聯(lián) , 才可以做后續(xù)的分配工作 。線程池中是以生產(chǎn)者消費(fèi)者模式 , 通過(guò)一個(gè)阻塞隊(duì)列來(lái)實(shí)現(xiàn)的 。阻塞隊(duì)列緩存任務(wù) , 工作線程從阻塞隊(duì)列中獲取任務(wù) 。

推薦閱讀