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. 可以想像進程跟線程為桌子跟人的狀況:

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

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

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

進程

進程的狀態變化:

線程

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已++
}
};

進程與線程的比較

多線程的幾種方法

  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

留言
avatar-img
留言分享你的想法!
avatar-img
dab戴伯的沙龍
1會員
37內容數
dab戴伯的沙龍的其他內容
2024/09/03
*本文章為參考李弘毅2021年機器學習課程後的筆記。 在訓練模型的時候,常常會遇到訓練上的問題,像是Loss值太大,或是Test出來的結果不如預期,但我們又不知道模型中到底發生了甚麼事,就跟黑盒子一樣。 因此,感謝李弘毅教授傳授了一套SOP來幫助我們判斷模型是哪裡出了問題,應該要怎麼解決!!
Thumbnail
2024/09/03
*本文章為參考李弘毅2021年機器學習課程後的筆記。 在訓練模型的時候,常常會遇到訓練上的問題,像是Loss值太大,或是Test出來的結果不如預期,但我們又不知道模型中到底發生了甚麼事,就跟黑盒子一樣。 因此,感謝李弘毅教授傳授了一套SOP來幫助我們判斷模型是哪裡出了問題,應該要怎麼解決!!
Thumbnail
2024/05/16
本文介紹自我監督學習的概念和訓練方式,以BERT和GPT為例,深入探討Masking Input及Fine-Tune的實際操作和可應用性。
Thumbnail
2024/05/16
本文介紹自我監督學習的概念和訓練方式,以BERT和GPT為例,深入探討Masking Input及Fine-Tune的實際操作和可應用性。
Thumbnail
2024/05/15
這篇文章探討了生成式對抗網路中機率分佈的使用與相關的訓練方式,包括Generator不同的點、Distriminator的訓練過程、生成圖片的條件設定等。此外,也提到了GAN訓練的困難與解決方式以及不同的learning方式。文章內容豐富且詳細,涵蓋了GAN的各個相關面向。
Thumbnail
2024/05/15
這篇文章探討了生成式對抗網路中機率分佈的使用與相關的訓練方式,包括Generator不同的點、Distriminator的訓練過程、生成圖片的條件設定等。此外,也提到了GAN訓練的困難與解決方式以及不同的learning方式。文章內容豐富且詳細,涵蓋了GAN的各個相關面向。
Thumbnail
看更多
你可能也想看
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
Thumbnail
  當我們要使用執行緒的時候,就要引用System.Threading的類別庫,程式才可以使用唷!這篇內容先說明:建立與啟用執行緒、跨執行緒控制UI介面、等待或暫停時間執行緒、共享資源的部分。
Thumbnail
  當我們要使用執行緒的時候,就要引用System.Threading的類別庫,程式才可以使用唷!這篇內容先說明:建立與啟用執行緒、跨執行緒控制UI介面、等待或暫停時間執行緒、共享資源的部分。
Thumbnail
  在說執行緒(Thread)時就要先知道什麼是程式(Program)、程序(Process),才能了解什麼是執行緒(Thread),因為它們間都有著神秘的關係與關聯,再更深入一點就又會有多程序(muti-Process)、多執行緒(muti-Thread),我們就先一一說明好了,了解它們後再使用時
Thumbnail
  在說執行緒(Thread)時就要先知道什麼是程式(Program)、程序(Process),才能了解什麼是執行緒(Thread),因為它們間都有著神秘的關係與關聯,再更深入一點就又會有多程序(muti-Process)、多執行緒(muti-Thread),我們就先一一說明好了,了解它們後再使用時
Thumbnail
介紹 委派的非同步方法 可以透過BeginInvoke執行委派的非同步方法 Action<T>.BeginInvoke(<T> obj,AsyncCallback callback,Object @object) 第一個內容的 obj,只的是要傳入acction委派的參數 第二個AsyncCallb
Thumbnail
介紹 委派的非同步方法 可以透過BeginInvoke執行委派的非同步方法 Action<T>.BeginInvoke(<T> obj,AsyncCallback callback,Object @object) 第一個內容的 obj,只的是要傳入acction委派的參數 第二個AsyncCallb
Thumbnail
介紹 📷 定義 處理序(Process) (大陸:進程): 一個程序運行時,占用全部計算資源的總和 執行緒(Thread) (大陸:線程):是作業系統能夠進行運算排程的最小單位。 大部分情況下,它被包含在行程之中,是行程中的實際運作單位。 C#多線程和異步(一)——基本概念和使用方法 執行緒帶來的
Thumbnail
介紹 📷 定義 處理序(Process) (大陸:進程): 一個程序運行時,占用全部計算資源的總和 執行緒(Thread) (大陸:線程):是作業系統能夠進行運算排程的最小單位。 大部分情況下,它被包含在行程之中,是行程中的實際運作單位。 C#多線程和異步(一)——基本概念和使用方法 執行緒帶來的
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News