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的內存模型:一個線程中變量的修改可能不會立即對其他線程可見。事實上,也許永遠不可見。
本文轉自demoblog博客園博客,原文鏈接http://www.cnblogs.com/0616--ataozhijia/p/3649519.html如需轉載請自行聯系原作者
demoblog
總結
以上是生活随笔為你收集整理的Androidi性能优化之多线程和同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java设计模式百例(番外) - Jav
- 下一篇: phpAdmin数据库管理套件