Androidi性能優化之多線程和同步


線程:

  創建線程的方法:

  a:定義Thread類的實例,並start();

  b:實現Runnable接口,並作為參數傳給Thread類的實例,然后start();

不管線程是通過什么方式創建的,它都有一個優先級,調度器根據優先級來決定調度執行哪個線程,即讓哪個線程使用CPU,調用Thread.setPriority()可以改變線程的優先級。thread.setPriority(Thread.MAX_PRIORITY); //最高優先級(比UI線程高)

  如果未指定優先級,會使用默認值,Thread類定義了三個變量:

  a:MIN_PRIORITY(1)

  b:NORM_PRIORITY(5) -----默認優先級

  C:MAX_PRIORITY(10)

  如果應用設置的線程優先級超出取值范圍,也就是說,小於1或大於10,那么會拋出Illegal ArgumentException異常

另一中設置線程優先級的方式是基於Linux優先級,主要參考的是android.os包里的Process.setThreadPriority API。

注意:應該避免混用Thread.setPriority和Process.setThreadPriority,這會使代碼一團糟。注意,Linux的優先級從-20(最高)到19(最低),而線程的優先級從1(最低)到10(最高)。

 

在Android中創建線程並在后台執行非常簡單,但更新用戶界面比較麻煩:因為view的方法只能在UI線程中調用,所以必須把結果反饋給主線程處理。

AsyncTask:

  很多情況下,應用處理順序如下:

  a:在UI線程收到事件

  b:在非UI線程中處理相應事件

  c:UI根據處理結果進行刷新

為了簡化這個模式,Android 1.5及以上版本定義了AsyncTask類,AsyncTask類可以讓應用執行后台操作,並通知UI線程操作結果。為簡單起見,對用戶隱藏了Thread、Runable以及其他相關對象。

  實際上,doInBackground()調用時機取決於Android版本,Android 1.6之前,任務是串行執行,只需要一個后來線程。從Android 1.6開始,線程池取代了單個的后台線程,線程池允許並行執行多個任務,以提升性能。然而,並行執行多個任務,如果沒有正確的同步或者任務執行順序不符合開發者的預期,那很可能導致嚴重的問題。因此,Android團隊計划在Honeycomb之后恢復到默認情況下只有一個后台線程的模式。

 

Handler和 Looper

  多線程應用程序通信的基石:Handler 、Looper

數據類型:

  我們知道兩種產生線程的方法,使用Thread和AsyncTask類,如果兩個或多個線程訪問相同的數據,就需要確保數據類型支持並發訪問。

同步(Synchronized)、易變(volatile)、內存模型

  如果想在多個線程之間共享對象,但沒有實現任何細粒度的鎖機制,可以用Synchronized關鍵字確保數據訪問的線性安全。

 Java的內存模型:一個線程中變量的修改可能不會立即對其他線程可見。事實上,也許永遠不可見。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM