網(wǎng)絡(luò)請(qǐng)求一般都是交給線程池進(jìn)行一些耗時(shí)的處理臀叙。
看一下okhttp異步請(qǐng)求的代碼:
使用內(nèi)部dispatcher對(duì)象來(lái)執(zhí)行請(qǐng)求捡遍,dispatcher就是調(diào)度器牵祟,獲得調(diào)度器之后會(huì)調(diào)用enqueue這個(gè)方法痪蝇,內(nèi)部傳入了AsyncCall這個(gè)對(duì)象攻旦,而AsyncCall這個(gè)對(duì)象就是一個(gè)Runnable喻旷,而在AsyncCall方法當(dāng)中可以使用okhttp攔截器鏈傳入request最終返回給response。
看一下enqueue這個(gè)方法:
就是說當(dāng)我們滿足以上這個(gè)條件的時(shí)候就會(huì)通過線程池executorService執(zhí)行我們請(qǐng)求的操作牢屋。
看一下內(nèi)部線程池是怎樣初始化的:
這個(gè)線程池是配置在dispatcher這個(gè)類當(dāng)中的且预。這個(gè)線程池的創(chuàng)建是ThreadPoolExecutor這個(gè)對(duì)象槽袄。
第一個(gè)參數(shù)0代表核心線程數(shù)量,就是保持在線程池當(dāng)中的線程數(shù)量锋谐,盡管這些線程可能空閑遍尺,但是這個(gè)線程數(shù)量就是我們關(guān)心的。為0就代表線程空閑之后不會(huì)被保留涮拗,就是說等待一段時(shí)間后就會(huì)停止乾戏。
第二個(gè)參數(shù)是int整數(shù)的最大值,他表示的是線程池中可以容納的最大線程數(shù)量三热。
第三個(gè)keepAliveTime鼓择,當(dāng)我們的線程池中線程數(shù)量大于核心線程數(shù)量時(shí),空閑線程需要等待60秒的時(shí)間才會(huì)被終止就漾。如果線程空閑之后呐能,只能存活60秒,如果收到20個(gè)并發(fā)請(qǐng)求从藤,線程池會(huì)創(chuàng)建20個(gè)線程催跪,當(dāng)完成之后會(huì)自動(dòng)關(guān)閉20個(gè)線程直到60秒,這就是造成阻塞的一個(gè)原因夷野。
第四個(gè)是一個(gè)創(chuàng)建好的等待線程的隊(duì)列,也是個(gè)同步隊(duì)列荣倾。它里面每一個(gè)插入操作必須等待另一個(gè)線程移除之后才能操作悯搔,這個(gè)隊(duì)列當(dāng)中其實(shí)是沒有任何一個(gè)元素的,可以把它理解為容量為0的一個(gè)隊(duì)列舌仍,甚至可以不把他理解為隊(duì)列妒貌,因?yàn)樗鎯?chǔ)的就是Runnable對(duì)象,就是說只有一個(gè)移除了另外一個(gè)才能插入铸豁。這種場(chǎng)景適合生產(chǎn)者和消費(fèi)者場(chǎng)景灌曙,就是說可以用最快的方式從生產(chǎn)者轉(zhuǎn)移給消費(fèi)者,這種場(chǎng)景對(duì)于那些高頻的網(wǎng)絡(luò)請(qǐng)求非常適合节芥。
最后一個(gè)參數(shù)就是線程工廠在刺,直接回創(chuàng)建一個(gè)守護(hù)線程用來(lái)處理dispatcher類耻台。