性能優化之 線程優化

線程調度原理

在任意時刻,只有一個線程佔用cpu,處於運行狀態,在多線程併發的情況下,輪流使用CPU的使用權,但是現在是多核的時代, 比如現在很多電腦或者手機是8核的,意思是有8個cpu,讓這8個cpu去執行任務,如果是執行任務很多的情況下,cpu是輪流的方式去執行任務的,而這個CPU去執行任務是由cpu去負責調度的,

線程調度模型

線程調度模型有二類

 第一類:分時調度

第二類: 搶佔式調度

在Java中是使用第二種方式

 

Android線程調度

也是分成二部分

第一:nice值,是在Process類中定義的 它的值越小 優化及越高

 /**
     * Default scheduling policy
     * @hide
     */
    public static final int SCHED_OTHER = 0;

這是Android中默認的優化線看看Android中默認的優先級有哪些:

第二:cgroup 

更嚴格的羣組調度策略,保證前臺線程更多的獲取cpu使用權

注意點

線程過多會導致CPU切換頻繁,降低線程運行效率,

線程優先級具有繼承性 , 比如我A線程優先級是5 B線程繼承了A,如果沒有設置優先級的話 那麼B線程的優先級也是5

 

android 異步方式

1:new Thread的方式來創建線程,這個方式簡單 但是在具體的項目不適合,因爲這種方式創建線程不具備服用,而且線程的創建和銷燬都是消耗資源,創建消耗內存資源

2:HandlerThread 自帶消息循環的,它是串行執行,比較適合長時間執行,不斷的從隊列中獲取任務

3:IntentService  它是繼承了Service類 內部創建了HandlerThread,相對Service,IntentService是運行在異步線程,不佔用主線程,不會阻塞UI線程的執行,還有它的優先級比Service高,不容易被系統Kill掉,

4:AsyncTask,這個基本用不到,但是裏面的源碼可以分析下,挺好的,在api14版本把之前的問題修復了

5:線程池,它的優點是線程能服用,減少了線程創建和銷燬的時間,從而提高了效率,還有定時 隊列優勢,在網絡框架和圖片加載框架都會用到

6:Rxjava 中也提供了異步線程的操作

線程池合理配置線程數

這裏指的配置線程數,是指線程池中的最大線程數,這個分情況, 看是IO密集型還是cpu密集型,比如網絡網絡請求
cpu密集型:cpu核數+1

io密集型:cpu核數*2+1

cpu的核數通過

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();

獲取,看下AsyncTask源碼就知道了,

CPU密集型

CPU密集型會消耗掉大量的CPU資源,例如需要大量的計算,視頻渲染啊,仿真啊之類的。這個時候CPU就卯足了勁在運行,這個時候切換線程,反而浪費了切換的時間,效率不高。

就像你的大腦是CPU,你本來就在一本心思地寫作業,多線程這時候就是要你寫會作業,然後立刻敲一會代碼,然後在P個圖,然後在看個視頻,然後再切換回作業。emmmm,過程中你還需要切換(收起來作業,拿出電腦,打開VS…)那你的作業怕是要寫到掛科。。。這個時候不太適合使用多線程,你就該一門心思地寫作業~

IO密集型

涉及到網絡、磁盤IO的都是IO密集型,這個時候CPU利用率並不高,這個時候適合使用多線程

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章