Android中的執行緒和執行緒池

2021-09-08 00:20:26 字數 3012 閱讀 1742

實現了runnable介面的類,稱為 執行緒輔助類;thread類才是真正的執行緒類

檢視原始碼可知道thread的構造方法可以傳入runnable物件等。

所以這裡就有常見的兩種方式實現runnable的方法建立執行緒

例項化runnable物件

class mythread implements runnable

}  mythread mt=new mythread();

thread td=new thread(mt);

td.start();

匿名內部類

runnable mt = new runnable() 

};thread mt1 = new thread(mt);

mt1.start();

和上述類似的兩種建立方法

class mythread extends thread

}  mythread mt=new mythread(「執行緒名稱」);

mt.start();

new thread("執行緒名稱") .start();
這裡需要提乙個方法 setpriority來設定執行緒的優先順序,這個範圍是 0- 10,預設為5,我面試的時候回答錯了,具體可檢視原始碼

另外需注意

優先順序高的執行緒不一定先執行,必須獲取到足夠的時間片資源,舉個栗子 a優先順序比b高,但此時的時間片資源剛好夠b執行而不夠a執行,可能b就會立即執行,但也可能會發生阻塞。

方便實現非同步通訊 不需使用 「任務執行緒(如繼承thread類) + handler」的複雜組合

asynctask的使用步驟有3個:

建立 asynctask 子類 & 根據需求實現核心方法

建立 asynctask子類的例項物件(即 任務例項)

手動呼叫execute(()從而執行非同步執行緒任務

訊息機制,主要是用來切換執行緒,進行ui的更新(android中只能在主線程更新ui)

非主線程內 一般使用handler.sendmessage()傳送訊息,然後主線程內新建handler的子類重寫handlemessage方法來處理訊息 或者 非主線程內直接使用handler.post()來切換到主線程

handlerthread本質上是通過繼承thread類和封裝handler類的使用,從而使得建立新執行緒和與其他執行緒進行通訊變得更加方便易用

使用步驟

// 步驟1:建立handlerthread例項物件

// 傳入引數 = 執行緒名字,作用 = 標記該執行緒

handlerthread mhandlerthread = new handlerthread("handlerthread");

// 步驟2:啟動執行緒

mhandlerthread.start();

// 步驟3:建立工作執行緒handler & 複寫handlemessage()

// 作用:關聯handlerthread的looper物件、實現訊息處理操作 & 與其他執行緒進行通訊

// 注:訊息處理操作(handlermessage())的執行執行緒 = mhandlerthread所建立的工作執行緒中執行

handler workhandler = new handler( handlerthread.getlooper() )

});// 步驟4:使用工作執行緒handler向工作執行緒的訊息佇列傳送訊息

// 在工作執行緒中,當訊息迴圈時取出對應訊息 & 在工作執行緒執行相關操作

// a. 定義要傳送的訊息

message msg = message.obtain();

msg.what = 2; //訊息的標識

msg.obj = "b"; // 訊息的存放

// b. 通過handler傳送訊息到其繫結的訊息佇列

workhandler.sendmessage(msg);

// 步驟5:結束執行緒,即停止執行緒的訊息迴圈

mhandlerthread.quit();

建構函式的引數意義

核心執行緒數、最大執行緒數、非核心執行緒超時時長、指定時間單位、任務佇列、執行緒工廠

使用步驟

// 1. 建立執行緒池

// 建立時,通過配置執行緒池的引數,從而實現自己所需的執行緒池

executor threadpool = new threadpoolexecutor(

core_pool_size,

maximum_pool_size,

keep_alive,

timeunit.seconds,

spoolworkqueue,

sthreadfactory

);// 2. 向執行緒池提交任務:execute()

// 說明:傳入 runnable物件

threadpool.execute(new runnable()

});// 3. 關閉執行緒池shutdown()

threadpool.shutdown();

// 關閉執行緒的原理

// a. 遍歷執行緒池中的所有工作執行緒

// b. 逐個呼叫執行緒的interrupt()中斷執行緒(注:無法響應中斷的任務可能永遠無法終止)

// 也可呼叫shutdownnow()關閉執行緒:threadpool.shutdownnow()

// 二者區別:

// shutdown:設定 執行緒池的狀態 為 shutdown,然後中斷所有沒有正在執行任務的執行緒

// shutdownnow:設定 執行緒池的狀態 為 stop,然後嘗試停止所有的正在執行或暫停任務的執行緒,並返回等待執行任務的列表

// 使用建議:一般呼叫shutdown()關閉執行緒池;若任務不一定要執行完,則呼叫shutdownnow()

Android的執行緒和執行緒池

執行緒是作業系統排程的最小單元 執行緒是乙個受限制的系統資源,即不能無限制的產生。執行緒的建立銷毀都有相應的開銷 時間片輪轉的方式排程每個執行緒 用途來講分為主線程和子執行緒 主線程 更新ui 子執行緒 耗時操作 在android中扮演執行緒的角色 thread,asynctask,intentse...

Android執行緒池

executors jdk1.5之後的乙個新類,提供了一些靜態工廠,生成一些常用的執行緒池,threadpoolexecutor是executors類的底層實現 1.newsinglethreadexecutor 建立乙個單執行緒的執行緒池。這個執行緒池只有乙個執行緒在工作,也就是相當於單執行緒序列...

Android 執行緒池

threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,timeunit unit blockingqueueworkqueue,threadfactory threadfactory corepoolsi...