Java高并发编程:HandlerThread
1. HandlerThread的使用
繼承自Thread,在run()方法中,執行了Looper.prepare()和Looper.loop(),和handler結合使用,實現后臺輪詢線程功能
- start()
- quit()
- getLooper()
2. HandlerThread源碼
Handler的構造,其實就是在Handler中持有一個指向該Looper.mQueue對象,當handler調用sendMessage方法時,其實就是往該mQueue中去插入一個message,然后Looper.loop()就會取出執行
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;} }我們要在子線程中調用Looper.prepare() 為一個線程開啟一個消息循環,默認情況下Android中新誕生的線程是沒有開啟消息循環的。(主線程除外,主線程系統會自動為其創建Looper對象,開啟消息循環。) Looper對象通過MessageQueue來存放消息和事件。一個線程只能有一個Looper,對應一個MessageQueue。 然后通過Looper.loop() 讓Looper開始工作,從消息隊列里取消息,處理消息。
注意:寫在Looper.loop()之后的代碼不會被執行,這個函數內部應該是一個循環,當調用mHandler.getLooper().quit()后,loop才會中止,其后的代碼才能得以運行。
3. HandlerThread的特點
HandlerThread將loop轉到子線程中處理,說白了就是將分擔MainLooper的工作量,降低了主線程的壓力,使主界面更流暢。
開啟一個線程起到多個線程的作用。處理任務是串行執行,按消息發送順序進行處理。HandlerThread本質是一個線程,在線程內部,代碼是串行處理的。
但是由于每一個任務都將以隊列的方式逐個被執行到,一旦隊列中有某個任務執行時間過長,那么就會導致后續的任務都會被延遲處理。
HandlerThread擁有自己的消息隊列,它不會干擾或阻塞UI線程。
對于網絡IO操作,HandlerThread并不適合,因為它只有一個線程,還得排隊一個一個等著。
4. 參考
詳解 Android 中的 HandlerThread
總結
以上是生活随笔為你收集整理的Java高并发编程:HandlerThread的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java高并发编程:线程池
- 下一篇: Java高并发编程:Callable、F