Android 中的執行緒是如何排程

2021-07-22 17:51:02 字數 976 閱讀 5538

執行緒排程聽起來很學術,是作業系統中的概念:執行緒排程決定系統中不同執行緒執行,執行時間,何時執行。android 中的執行緒排程很作業系統中的執行緒排程類似,主要使用 nice 和 cgroups 這兩個變數來排程執行緒(本質上來說還是通過設定執行緒優先順序,讓 linux 核心有依據的分配執行緒執行)。

nice

nice這種特性可以讓後台工作執行緒盡量少搶占前台執行緒的時間片(從os來說),從而保證了使用者介面的流暢性。實際上,仍有一種可能使 ui 卡死,例如有30個後台執行緒,但是只有1個 ui 程序,這30個後台執行緒可能佔據了很大的計算資源,導致 ui 執行緒得不到及時執行,導致卡頓、掉幀;為了防止這種情況發生, android 提出了 cgroups ,用來解決類似的問題。

cgroups

為了解決上述問題,android 將前台執行緒和後台執行緒分開執行,即利用linux的 cgroups 給前台執行緒建乙個群,給後台執行緒建乙個群,然後排程器在這兩個群中跑,這樣不管後台執行緒有多少,排程器總能照顧到前台執行緒的執行;所以使用者體驗得到了保證。

如何區分前台程序和後台程序的 cgroup?

android 會自動將沒有在前台程序 cgroup 執行的執行緒都放到後台程序的 cgroup 中,這就保證了不管開多少執行緒,只會將其分為兩個 group,前台 cgroup 和後台 cgroup;理論上,不管多少非前台執行緒執行,android都能保證前台執行緒的執行。

設定執行緒屬性

需要銘記於心的是,在 ui 主線程例項化的執行緒或執行緒池,都會繼承 default 或 foreground 屬性(因為 ui 執行緒就是這個屬性,子執行緒會繼承父執行緒的屬性),所以如果大量類似工作執行緒存在於前台程序的 cgroup 中話,可能會使 ui 變得非常不流暢。若是工作執行緒,建議在執行前通過 process.setthreadpriority(process.thread_priority_background) 直接設定執行緒的屬性。

1 new thread(new runnable()

8 }).start();

Android 中如何關閉執行緒

在android中開啟的執行緒用thread.stop 來關閉是不會真正關閉的,當我們再次start執行緒的時候,會產生異常 thread is already started.class testthread extends thread 在需要關閉的時候,將flag置為false istrue ...

Android 中如何關閉執行緒

在android中開啟的執行緒用thread.stop 來關閉是不會真正關閉的,當我們再次start執行緒的時候,會產生異常 thread is already started.class testthread extends thread 在需要關閉的時候,將flag置為false istrue ...

dbn中的wake sleep演算法是如何調優的?

wake sleep algorithm的fine tuning演算法在hinton06年的那篇 最後是有偽碼的,hinton使用的標準的dbn自畫圖如下 i wake phase 認知階段 先用認知階段的引數計算每一層的認知階段的狀態 從下往上推.wakehidprobs sigmoid wvis...