Android下的多執行緒

2021-08-25 16:10:02 字數 1990 閱讀 8492

在android下面也有多執行緒的概念,在c/c++中,子執行緒可以是乙個函式,一般都是乙個帶有迴圈的函式,來處理某些資料,優先執行緒只是乙個複雜的運算過程,所以可能不需要while迴圈,運算完成,函式結束,執行緒就銷毀。對於那些需要控制的執行緒,一般我們都是和互斥鎖相互關聯,從而來控制線程的進度,一般我們建立子執行緒,一種執行緒是很常見的,那就是帶有訊息迴圈的執行緒。

訊息迴圈是乙個很有用的執行緒方式,曾經自己用c在linux下面實現乙個訊息迴圈的機制,往訊息佇列裡新增資料,然後非同步的等待訊息的返回。當訊息隊列為空的時候就會掛起執行緒,等待新的訊息的加入。這是乙個很通用的機制。

在android,這裡的執行緒分為有訊息迴圈的執行緒和沒有訊息迴圈的執行緒,有訊息迴圈的執行緒一般都會有乙個looper,這個事android的新概念。我們的主線程(ui執行緒)就是乙個訊息迴圈的執行緒。針對這種訊息迴圈的機制,我們引入乙個新的機制handle,我們有訊息迴圈,就要往訊息迴圈裡面傳送相應的訊息,自定義訊息一般都會有自己對應的處理,訊息的傳送和清除,訊息的的處理,把這些都封裝在handle裡面,注意handle只是針對那些有looper的執行緒,不管是ui執行緒還是子執行緒,只要你有looper,我就可以往你的訊息佇列裡面新增東西,並做相應的處理。

但是這裡還有一點,就是只要是關於ui相關的東西,就不能放在子執行緒中,因為子執行緒是不能操作ui的,只能進行資料、系統等其他非ui的操作。

那麼什麼情況下面我們的子執行緒才能看做是乙個有looper的執行緒呢?我們如何得到它looper的控制代碼呢?

looper.mylooper();獲得當前的looper

looper.getmainlooper () 獲得ui執行緒的lopper

我們看看handle的初始化函式,如果沒有引數,那麼他就預設使用的是當前的looper,如果有looper引數,就是用對應的執行緒的looper。

如果乙個執行緒中呼叫looper.prepare(),那麼系統就會自動的為該執行緒建立乙個訊息佇列,然後呼叫 looper.loop();之後就進入了訊息迴圈,這個之後就可以發訊息、取訊息、和處理訊息。這個如何傳送訊息和如何處理訊息可以再其他的執行緒中通過handle來做,但前提是我們的hanle知道這個子執行緒的looper,但是你如果不是在子執行緒執行 looper.mylooper(),一般是得不到子執行緒的looper的。

public void run()

looper.loop();

}所以很多人都是這樣做的:我直接在子執行緒中新建handle,然後在子執行緒中傳送訊息,這樣的話就失去了我們多執行緒的意義了。

class mythread extends thread.

* @param name a name for the new thread

*/worker(string name) catch (interruptedexception ex) }}

}public looper getlooper()

public void run()

looper.loop();

}public void quit()

}我們知道,乙個執行緒類的建構函式是在主線程中完成的,所以在我們的 worker的建構函式中我們創佳乙個執行緒,然後讓這個執行緒執行,這一這個執行緒的建立是指定乙個 runnabl,這裡就是我們的worker本身,在主線程呼叫 t.start();,這後,我們子執行緒已經建立,並且開始執行work的run方法。然後下面的**很藝術:

synchronized (mlock) catch (interruptedexception ex) }}

我們開始等待我們的子執行緒給mlooper賦值,如果不賦值我們就繼續等,然後我們的子執行緒在執行run方法之後,在給 mlooper賦值之後,通知worker夠著函式中的wait,然後我們的建構函式才能完成,所以我們說:

malbumartworker = new worker("album art worker");

這句本身就是阻塞的,它建立了乙個子執行緒,開啟了子執行緒,並且等待子執行緒給mlooper賦值,賦值完成之後,這個函式才返回,這樣才能保證我們的子執行緒的looper的獲取絕對是正確的,這個構思很有創意。值得借鑑。

Android 多執行緒

1 簡介 2 android 平台下的多執行緒 package com.powerise.thread import android.os.bundle import android.view.view import android.view.view.onclicklistener import ...

Android 多執行緒

1,常用的thread 和running的方法 public static void thread thread.start private static void running thread thread new thread runnable thread.start private stat...

Android 多執行緒

最近開始做安卓專案,然而對多執行緒的理解和應用還是欠缺,最近就系統的學習一下 public class testthreadactivity extends baseactivity private void initviews private class mytask extends asynct...