Java高并发编程:HandlerThread
1. HandlerThread的使用
繼承自Thread,在run()方法中,執(zhí)行了Looper.prepare()和Looper.loop(),和handler結(jié)合使用,實現(xiàn)后臺輪詢線程功能
- start()
- quit()
- getLooper()
2. HandlerThread源碼
Handler的構(gòu)造,其實就是在Handler中持有一個指向該Looper.mQueue對象,當(dāng)handler調(diào)用sendMessage方法時,其實就是往該mQueue中去插入一個message,然后Looper.loop()就會取出執(zhí)行
public class HandlerThread extends Thread {int mPriority;int mTid = -1;Looper mLooper;public HandlerThread(String name) {super(name);mPriority = Process.THREAD_PRIORITY_DEFAULT;}public HandlerThread(String name, int priority) {super(name);mPriority = priority;}protected void onLooperPrepared() {}@Overridepublic void run() {mTid = Process.myTid();Looper.prepare();synchronized (this) {mLooper = Looper.myLooper();notifyAll();}Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop();mTid = -1;}public Looper getLooper() {if (!isAlive()) {return null;}// If the thread has been started, wait until the looper has been created.synchronized (this) {while (isAlive() && mLooper == null) {try {wait();} catch (InterruptedException e) {}}}return mLooper;}public boolean quit() {Looper looper = getLooper();if (looper != null) {looper.quit();return true;}return false;}public boolean quitSafely() {Looper looper = getLooper();if (looper != null) {looper.quitSafely();return true;}return false;}public int getThreadId() {return mTid;} }我們要在子線程中調(diào)用Looper.prepare() 為一個線程開啟一個消息循環(huán),默認(rèn)情況下Android中新誕生的線程是沒有開啟消息循環(huán)的。(主線程除外,主線程系統(tǒng)會自動為其創(chuàng)建Looper對象,開啟消息循環(huán)。) Looper對象通過MessageQueue來存放消息和事件。一個線程只能有一個Looper,對應(yīng)一個MessageQueue。 然后通過Looper.loop() 讓Looper開始工作,從消息隊列里取消息,處理消息。
注意:寫在Looper.loop()之后的代碼不會被執(zhí)行,這個函數(shù)內(nèi)部應(yīng)該是一個循環(huán),當(dāng)調(diào)用mHandler.getLooper().quit()后,loop才會中止,其后的代碼才能得以運行。
3. HandlerThread的特點
HandlerThread將loop轉(zhuǎn)到子線程中處理,說白了就是將分擔(dān)MainLooper的工作量,降低了主線程的壓力,使主界面更流暢。
開啟一個線程起到多個線程的作用。處理任務(wù)是串行執(zhí)行,按消息發(fā)送順序進行處理。HandlerThread本質(zhì)是一個線程,在線程內(nèi)部,代碼是串行處理的。
但是由于每一個任務(wù)都將以隊列的方式逐個被執(zhí)行到,一旦隊列中有某個任務(wù)執(zhí)行時間過長,那么就會導(dǎo)致后續(xù)的任務(wù)都會被延遲處理。
HandlerThread擁有自己的消息隊列,它不會干擾或阻塞UI線程。
對于網(wǎng)絡(luò)IO操作,HandlerThread并不適合,因為它只有一個線程,還得排隊一個一個等著。
4. 參考
詳解 Android 中的 HandlerThread
總結(jié)
以上是生活随笔為你收集整理的Java高并发编程:HandlerThread的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java高并发编程:线程池
- 下一篇: Java高并发编程:Callable、F