Android 進程與線程整理

閱讀時間約 7 分鐘

概要

  1. 在一個Android程序開始時,只會啟動一個Process(進程),關於此程序中的Activity與Service都會跑在這個Process之內。
  2. 而一個Process之中也會有很多個Thread,當一個Process被創造時,也會同時創造出一個Thread(Main Thread),所有的任務也都在一個Thread中進行,而主線程則負責UI介面的顯示和交互。
  3. 比較耗時的任務就需要交給子線程去做,避免主線程阻塞而導致ANR(Application not response)的情況。
  4. 實現多線程的方式分別有Thread, Runnable, Handler, AsyncTask, HandlerThread, IntentService的方式
  5. 可以想像進程跟線程為桌子跟人的狀況:

一進程一線程:一個人在一張桌子上吃飯

一進程多線程:多個人在一張桌子上吃飯

多進程一線程:每個人在自己的桌子上吃飯

進程

進程的狀態變化:

raw-image

線程

CPU調度與分派的最基本單位,比進程更小。

使用的函數:

run(): 線程運行時會執行的區塊

start(): 啟動線程

sleep()/sleep(long millis): 將線程進入睡眠,不會釋放lock

yield(): 讓線程釋出CPU。

wait(): 進入阻塞狀態,釋放lock。

interrupt(): 中斷線程,僅限於阻塞狀態的線程。

get/setName(): 設置線程的name。

get/setPriority(): 設置線程的優先順序。

setDaemon/isDaemo(): 設置是否為守護線程。

currentThread(): 獲取當前線程。

線程的狀態:

新建 -> 就緒 -> 運行 -> 阻塞 -> 死亡

程式法宣告的幾種方式:

//1
public class MyThread extends Thread{

@Override
public void run() {
super.run();
// do something
}
}
public void goThread() {
    new MyThread().start();
}
//2.1 實現Runnable的方式
public class MyRunnable implements Runnable{

@Override
public void run() {
// do something
}
}
new Thread(new MyRunnable()).start();

//2.2 另一種啟動方式
new Thread(new Runnable() {
@Override
public void run() {

}
}).start();
//4 Handler啟動線程的方式
private int count = 0;
private Handler mHandler = new Handler();

private Runnable runnable = new Runnable() {
@Override
public void run() {
Log.i("download",Thread.currentThread().getName()+":"+count);
count ++;
mHandler.postDelayed(runnable,1000); // 执行后延迟1000毫秒再次执行,count已++
}
};

進程與線程的比較

raw-image

多線程的幾種方法

  1. 繼承Thread
  2. 實現Runnable
  3. Handler
  4. AsyncTask
  5. HandlerThread

HandlerThread

一般我們在進行Handler時,預設是在Main Thread,如果要多開Thread來用Handler,則必須自行控制Looper,因此Android 開發了HandlerThread來整合這些狀況。

通過繼承Threa類與封裝Handler類以達到兩者的效果。

HandlerThread是能夠確保是循序且執行緒安全的,同時做到Thread與Handler的功能。

程式碼:

private void initHandleMessage() {
//1. 創建HandlerThread實例對象
//2. 啟動線程
//3. 創建工作線程Handler以及override handleMessage()
//4. 使用Message發送消息
//5. 結束線程,停止消息循環
private Handler mHandler = null;
    HandlerThread handlerThread = new  HandlerThread("newThread");   
handlerThread.start();
this.mHandler = new Handler(handlerThread.getLooper()) {//括號內放的是存取哪個線程looper(Looper.getMainLooper())
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
...
        }
    Message msg = Message.obtain();
msg.what = 2;
msg.obj = "B";
Handler handler = this.mHandler;
handler.sendMessage(Message.obtain(handler, what: 1));
    mHandlerThread.quit();

線程安全的幾種方式

線程安全關乎於幾種特性:

  1. 在進行相關操作時,不會中途被其他線程干擾。
  2. 若一個線程修改了其中的變數,其他線程能夠立刻知道。
  3. 線程有保證他的順序。

synchronized

當在程式碼加入synchronized之後,其他線程必須等待先使用的線程調用完才能調用。目的是保證線程安全,並解決多線程中的並發同步問題。

程式碼:

public void method() {

synchronized(this) {

….

}

或是

public void f1() {

synchronized(lock) { //鎖必須是公共變量才行

}

參考資料:https://www.jianshu.com/p/7a8cb20cfd80

https://jasonblog.github.io/note/android_note/androidsi_da_zu_jian_ff1a_service_sheng_ming_zhou_.html

    1會員
    37內容數
    留言0
    查看全部
    發表第一個留言支持創作者!
    dab戴伯的沙龍 的其他內容
    Activity生命週期 onCreate: 第一次開啟時會進入的流程,只會執行一次 onStart: 將Activity的頁面可視化,並將UI物件初始化使其可和使用者互動 onResume:使用者進行互動時在這個階段,直到使用者切換頁面之後,切換成onPause。 onPause : 有其
    Android 主要從上層(接近使用者)到最底層(接近硬體)順序為: Application -> Framework -> Hal -> Linux Kernel。 Application層:應用程序是在這進行發展,也是使用者直接接觸到的部分。 Framework層:這裡會透過AIDL與Se
    DHCP 獲取IP位址。 在建立完兩者的連接後,STA會優先發起DISCOVER的廣播,要求網域提供IP地址的分配,網內的DHCP服務器收到後,會選擇一個IP地址發送給客戶端(OFFER),收到OFFER的STA會再發送一個Request確認是否為該IP位址,若沒錯,DHCP會回傳ACK表示確認
    WIFI連接過程主要分成三步驟: 掃描 (Probe Request, Probe Response) 認證 (Authentication) 連接 (Association Request, Association Response) Eapol(WEP, WPA, WPA2) DHCP
    Android Wifi掃瞄的部分區分成被動掃描與主動掃描: 主動掃瞄:每隔一段時間廣播發送probe request的請求,在各個頻段上詢問AP的訊息,若有收到回應,做紀錄,超時的話則換到下個頻段進行廣播。 被動掃瞄:不發送請求,因為是以省電為目的,因此是單純接收AP傳送的beacon,通過接
    主要在工作上剛好接觸到SQLite的資料庫,因此想藉由這個機會將這個技術了解一下~ Android 內可使用SQLite資料庫,有著輕量級的特性,因此適合用於行動設備上。Android SQLite 主要提供SQLiteOpenHelper與SQLiteDatabase兩個類別使用。 而這次主要
    Activity生命週期 onCreate: 第一次開啟時會進入的流程,只會執行一次 onStart: 將Activity的頁面可視化,並將UI物件初始化使其可和使用者互動 onResume:使用者進行互動時在這個階段,直到使用者切換頁面之後,切換成onPause。 onPause : 有其
    Android 主要從上層(接近使用者)到最底層(接近硬體)順序為: Application -> Framework -> Hal -> Linux Kernel。 Application層:應用程序是在這進行發展,也是使用者直接接觸到的部分。 Framework層:這裡會透過AIDL與Se
    DHCP 獲取IP位址。 在建立完兩者的連接後,STA會優先發起DISCOVER的廣播,要求網域提供IP地址的分配,網內的DHCP服務器收到後,會選擇一個IP地址發送給客戶端(OFFER),收到OFFER的STA會再發送一個Request確認是否為該IP位址,若沒錯,DHCP會回傳ACK表示確認
    WIFI連接過程主要分成三步驟: 掃描 (Probe Request, Probe Response) 認證 (Authentication) 連接 (Association Request, Association Response) Eapol(WEP, WPA, WPA2) DHCP
    Android Wifi掃瞄的部分區分成被動掃描與主動掃描: 主動掃瞄:每隔一段時間廣播發送probe request的請求,在各個頻段上詢問AP的訊息,若有收到回應,做紀錄,超時的話則換到下個頻段進行廣播。 被動掃瞄:不發送請求,因為是以省電為目的,因此是單純接收AP傳送的beacon,通過接
    主要在工作上剛好接觸到SQLite的資料庫,因此想藉由這個機會將這個技術了解一下~ Android 內可使用SQLite資料庫,有著輕量級的特性,因此適合用於行動設備上。Android SQLite 主要提供SQLiteOpenHelper與SQLiteDatabase兩個類別使用。 而這次主要
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
    Thumbnail
    Android TV 開發教學,會有人想學 Android TV APP 嗎?有人對電視上的應用程式有興趣嗎?
    Thumbnail
    在Android平台上探索角色扮演遊戲的世界,是許多遊戲愛好者的最愛。隨著手機遊戲的不斷演進,現在的RPG遊戲已經讓人目不暇給。今天我們將帶您深入了解最受歡迎的Android RPG遊戲,讓您能夠輕鬆找到您下一個遊戲冒險的目的地。
    Thumbnail
    現在的智慧型手機都已經具有定位功能,可在Google地圖知道自己的所在位置,也能夠傳送座標給朋友輕鬆找到會面地點。 其實連手機拍出的照片,也能夠自動儲存拍照地點的定位資訊!
    Thumbnail
    惡意軟體Malware是指專門設計用來破壞、干擾或竊取電腦系統、網路或設備的軟體,常見攻擊目標包括高階用戶和廣泛使用的應用程式。 而Rafel RAT是一種針對Android手機的新型惡意軟體,能夠控制用戶的設備,甚至攔截2FA雙重驗證訊息,主要透過偽裝成合法應用程式並取得敏感權限來進行攻擊。
    Thumbnail
    Android 版 Chrome 瀏覽器中新增了朗讀功能,可以將網頁文字轉換為語音並播放,方便用戶聆聽網頁內容,支援多國語言,包括繁/簡體中文、英文、日語、法文、德文等,還可調整播放速度和選擇語音。
    Thumbnail
    瀏覽器安裝擴充功能可以發揮本身以外的功能。微軟於 2023 年開始在 Android 版 Edge 上測試擴充功能,現階段可以取得官方推薦項目,無法前往 Chrome 或 Edge 商店安裝擴充功能。
    Thumbnail
    本課程學習如何建立 Android Wear (Wear OS by Google) 智慧穿戴式手錶專案的步驟。詳細說明了如何在 Android Studio 中建立 Wear OS 專案,包括選擇專案範本、設定專案屬性、建立手錶模擬器等步驟。最後,示範了運行專案並在模擬器上修改顯示文字的過程。
    Thumbnail
    本課程學習如何透過函數重構程式碼,提高可讀性、可維護性和重用性。以按鈕操作為例,將不同邏輯提取成函數,例如 allClear()、equalSign() 等,使程式碼更簡潔易懂,提升開發效率。
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
    Thumbnail
    Android TV 開發教學,會有人想學 Android TV APP 嗎?有人對電視上的應用程式有興趣嗎?
    Thumbnail
    在Android平台上探索角色扮演遊戲的世界,是許多遊戲愛好者的最愛。隨著手機遊戲的不斷演進,現在的RPG遊戲已經讓人目不暇給。今天我們將帶您深入了解最受歡迎的Android RPG遊戲,讓您能夠輕鬆找到您下一個遊戲冒險的目的地。
    Thumbnail
    現在的智慧型手機都已經具有定位功能,可在Google地圖知道自己的所在位置,也能夠傳送座標給朋友輕鬆找到會面地點。 其實連手機拍出的照片,也能夠自動儲存拍照地點的定位資訊!
    Thumbnail
    惡意軟體Malware是指專門設計用來破壞、干擾或竊取電腦系統、網路或設備的軟體,常見攻擊目標包括高階用戶和廣泛使用的應用程式。 而Rafel RAT是一種針對Android手機的新型惡意軟體,能夠控制用戶的設備,甚至攔截2FA雙重驗證訊息,主要透過偽裝成合法應用程式並取得敏感權限來進行攻擊。
    Thumbnail
    Android 版 Chrome 瀏覽器中新增了朗讀功能,可以將網頁文字轉換為語音並播放,方便用戶聆聽網頁內容,支援多國語言,包括繁/簡體中文、英文、日語、法文、德文等,還可調整播放速度和選擇語音。
    Thumbnail
    瀏覽器安裝擴充功能可以發揮本身以外的功能。微軟於 2023 年開始在 Android 版 Edge 上測試擴充功能,現階段可以取得官方推薦項目,無法前往 Chrome 或 Edge 商店安裝擴充功能。
    Thumbnail
    本課程學習如何建立 Android Wear (Wear OS by Google) 智慧穿戴式手錶專案的步驟。詳細說明了如何在 Android Studio 中建立 Wear OS 專案,包括選擇專案範本、設定專案屬性、建立手錶模擬器等步驟。最後,示範了運行專案並在模擬器上修改顯示文字的過程。
    Thumbnail
    本課程學習如何透過函數重構程式碼,提高可讀性、可維護性和重用性。以按鈕操作為例,將不同邏輯提取成函數,例如 allClear()、equalSign() 等,使程式碼更簡潔易懂,提升開發效率。