上次翻譯的是第五季第七集,這次是第九集,中間還差個(gè)第八集,因?yàn)槟承┰虼蛩愫竺嬖诜g,這次呢講的是線程的優(yōu)先級(jí)對(duì)于性能的影響,接下來(lái)就讓我們進(jìn)入主題吧。
本期視頻地址:
https://www.youtube.com/watch?v=NwFXVsM15Co&index=9&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
視頻剛開(kāi)頭就是一段閱讀讀者來(lái)信的內(nèi)容,信的內(nèi)容是這樣的:“你個(gè)禿頂,老子看了你的線程方面的視頻,自己創(chuàng)建了 100 個(gè)線程去完成任務(wù),使我的 App 變慢了。你真是個(gè)糟糕的人,你應(yīng)該感到愧疚!”,當(dāng)然這是我?jiàn)蕵?lè)的翻譯。
技術(shù)上,你可以在你的 App 中創(chuàng)建上百個(gè)線程,但正如你猜的,這或許不是性能上最佳的注意。
將太多線程填充到?jīng)]有足夠 CPU 的機(jī)器上是個(gè)老問(wèn)題了,幾十年了,線程調(diào)度器已經(jīng)通過(guò)各種度量方式,來(lái)確定 CPU 此刻應(yīng)該執(zhí)行哪個(gè)線程來(lái)解決問(wèn)題。
基本上,每個(gè)線程都被分配來(lái)了一個(gè)優(yōu)先級(jí)。
調(diào)度器,之后給出了更重要的線程偏好,平衡了最終真的需要執(zhí)行的任務(wù)。
現(xiàn)在,優(yōu)先級(jí)有以下幾種分配方式。
首先,Android 分配線程的優(yōu)先級(jí)基于 App 中 Activity 的生命周期狀態(tài)。
App 中可見(jiàn)的 Activity 被分配到了前臺(tái)組,其余的被分配到了后臺(tái)組。
在前臺(tái)組的線程在設(shè)備中獲得了了大概 90% ~ 95% 總執(zhí)行時(shí)間,而處在后臺(tái)組的線程則只占了 5% ~ 10%,哪個(gè)有道理呢?
我的意思是,在屏幕上可見(jiàn)的應(yīng)用比那些不可見(jiàn)的應(yīng)用獲得更多的處理器分配。
其次,重要的是注意當(dāng)線程被創(chuàng)建時(shí),默認(rèn)的賦予了它,與其他被創(chuàng)建的線程相同的優(yōu)先級(jí)。
因此,它們?cè)谙嗤臈l件下競(jìng)爭(zhēng)處理器時(shí)間的分配。
So,如果你的主線程創(chuàng)建了 20 個(gè)其他高優(yōu)先級(jí)的工作線程,它們都將競(jìng)爭(zhēng)同樣的 CPU 資源,這幾乎毀了你在 16 ms 內(nèi)完成所有 UI 線程工作的機(jī)會(huì)。
為了修復(fù)這個(gè)問(wèn)題,你應(yīng)該明確的為你應(yīng)用中創(chuàng)建的任何線程都設(shè)置線程的優(yōu)先級(jí)。
這幫助系統(tǒng)在相同的控制組中去調(diào)度競(jìng)爭(zhēng)線程。
在 Android 中可以方便的 Process.setThreadPriority() 這個(gè) API 來(lái)設(shè)置線程的優(yōu)先級(jí)。
現(xiàn)在,令人疑惑的是,這個(gè)函數(shù)取值范圍為 -20 ~ 20 的正整數(shù)(官方文檔寫(xiě)著 -20 ~ 19),其中較低的值表示較高的優(yōu)先級(jí)。
技術(shù)上,這些數(shù)字實(shí)際上應(yīng)該表示這個(gè)線程在分享時(shí)間方面的友好程度,所以,負(fù)數(shù)意味著更敵對(duì)的時(shí)間分享(更不愿分享)。
但無(wú)所謂。
使之更清楚一點(diǎn),Android 提供了一些值得使用值。
這些值被定義在 android.os.Process 中,并且可以當(dāng)做基礎(chǔ)狀態(tài)。
默認(rèn)的,當(dāng)然是你的線程通常給出的。
在此之上,這里還有一對(duì)可以量化的值,用來(lái)幫助你增加或減少優(yōu)先級(jí),以獲得更細(xì)微的控制。
例如,UI 線程永遠(yuǎn)被分配默認(rèn)的優(yōu)先級(jí),任何其他的生成的線程也將被賦予同樣的值。
但實(shí)際上,工作線程應(yīng)該用較低的優(yōu)先級(jí),你可以通過(guò)添加 THREAD_PRIORITY_LESS_FAVORABLE 來(lái)設(shè)置,畢竟值越大優(yōu)先級(jí)越低。
這種方法可以讓你生成的線程可能相比其他線程擁有較多或者較少的重要性。
事實(shí)上,自己設(shè)置這些優(yōu)先級(jí)可能很麻煩。
這就是為什么有了 AsyncTask 和 IntentService 替我們做了這些設(shè)置,所以,你不必處理這些。
但如果你使用原始線程,那么當(dāng)然你必須自己設(shè)置優(yōu)先級(jí),所以請(qǐng)留意下,性能上可能出現(xiàn)的奇怪的事情。
翻譯有些不太好,有些句子還是理解不好,有些句子讀起來(lái)很拗口,我會(huì)盡量完善自己英文水平,這就是本期視頻的內(nèi)容,有興趣的話你可以自己去 YouTube 上親自看看。
我之前看過(guò) AsyncTask 但是并沒(méi)有注意到這一點(diǎn),而我在這個(gè)系列視頻中也學(xué)到了不少關(guān)于性能上注意點(diǎn),畢竟官方啊。