線程:
創建線程的方法:
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的內存模型:一個線程中變量的修改可能不會立即對其他線程可見。事實上,也許永遠不可見。
