The Importance of Thread Priority (Android Performance Patterns Season 5, Ep. 9)

上次翻譯的是第五季第七集,這次是第九集,中間還差個(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)頭.png

視頻剛開(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)題。

多線程同時(shí)工作.jpg

基本上,每個(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)組與后臺(tái)組的時(shí)間分配.png

在前臺(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í)。

線程們都有相同的優(yōu)先級(jí).png

因此,它們?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ì)。

它們也會(huì)和主線程競(jìng)爭(zhēng)資源.png

為了修復(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í)。

Process.setThreadPriority().png

現(xiàn)在,令人疑惑的是,這個(gè)函數(shù)取值范圍為 -20 ~ 20 的正整數(shù)(官方文檔寫(xiě)著 -20 ~ 19),其中較低的值表示較高的優(yōu)先級(jí)。

setThreadPriority(int).png

技術(shù)上,這些數(shù)字實(shí)際上應(yīng)該表示這個(gè)線程在分享時(shí)間方面的友好程度,所以,負(fù)數(shù)意味著更敵對(duì)的時(shí)間分享(更不愿分享)。

但無(wú)所謂。

使之更清楚一點(diǎn),Android 提供了一些值得使用值。

Process 類中自帶的一些常量.jpg

這些值被定義在 android.os.Process 中,并且可以當(dāng)做基礎(chǔ)狀態(tài)。

默認(rèn)的,當(dāng)然是你的線程通常給出的。

在此之上,這里還有一對(duì)可以量化的值,用來(lái)幫助你增加或減少優(yōu)先級(jí),以獲得更細(xì)微的控制。

更細(xì)微的控制值.png

例如,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è)置工作線程的優(yōu)先級(jí).png

這種方法可以讓你生成的線程可能相比其他線程擁有較多或者較少的重要性。

事實(shí)上,自己設(shè)置這些優(yōu)先級(jí)可能很麻煩。

這就是為什么有了 AsyncTask 和 IntentService 替我們做了這些設(shè)置,所以,你不必處理這些。

系統(tǒng)提供好了這些類.png

但如果你使用原始線程,那么當(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),畢竟官方啊。

AsyncTask 源碼.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,065評(píng)論 25 708
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,868評(píng)論 18 139
  • 大部分夏天跑步的時(shí)候,基本跑十公里以下我是沒(méi)有補(bǔ)水的習(xí)慣。按照計(jì)劃是打算一周練習(xí)一次半馬,在夏天的時(shí)候還好。但是到...
    Viking_Zhang閱讀 1,554評(píng)論 0 0
  • 我喜歡內(nèi)心有熱度的人,并且認(rèn)為冷漠是可恥的。 汪兄古道熱腸,待我如兄弟。我搬到西郊小院之后,曾邀請(qǐng)他過(guò)來(lái)飲茶,也順...
    海月先生閱讀 842評(píng)論 1 11
  • gitbub地址效果展示 由于網(wǎng)絡(luò)問(wèn)題,可能加載較慢 1. 各個(gè)星球軌跡的實(shí)現(xiàn) 先把邊框變成一個(gè)圓然后利用css3...
    WMLJS閱讀 2,030評(píng)論 0 1