線程間的交互
- 一個線程啓動別的線程:
new Thread().start()
、Executor.execute()
等
- 一個線程終結另外一個線程
- Thread.stop()
- Thread.interrupt():溫和式終結:不當即、不強制
Interrupt()
和isInterrupted()
:檢查(和重置)中斷狀態
InterruptedException
:若是在線程等待時中斷,或者在中斷狀態等待,直接結束等待過程
- Object.wait()和Object.notify()/notifyAll()
- 在未達到目標時wait()
- 用while循環檢查
- 設置完成後notifyAll()
- wait()和notify()/notifyAll()都須要放在同步代碼塊裏
- Thread.join():讓另外一個線程插在本身前面
- Threa.yield():暫時讓出本身的時間片給同優先級的線程
Android的Handler機制
- 本質:在某個指定的運行中的線程上執行代碼
- 思路:在接受任務的線程上執行循環判斷
- 基本實現:
- Thread裏while循環檢查
- 加上Looper(優點在於自定義Thread的代碼能夠少些不少)
- 再加上Handler(優點在於功能分拆,並且能夠有多個Handler)
- java的Handler機制:
- HandlerThread:具體的線程
- Lopper:負責循環、條件判斷和任務執行
- Handler:負責任務的定製和線程間傳遞
- AsyncTask:
- AsyncTask的內存泄漏
- 衆所周知的緣由:AsyncTask持有外部Activity的引用
- 沒提到的緣由:執行中的線程不會被系統回收
- java回收策略:沒有被GC Root直接或間接持有引用的對象,會被回收 GC Root:
- 運行中的線程
- 靜態對象
- 來自native code中的引用
- 因此AsyncTask的內存泄漏其餘的線程方案都會有(Thread、Executor、HandlerThread)同樣都有,不能認爲AsyncTask比別的方案更危險
- 就算是使用AsyncTask,只要任務的時間不長,就沒有必要作紡織內存泄漏的處理
Service和IntentService
- Service:後臺任務的活動空間。使用場景:音樂播放器等。
- IntentService:執行單個任務後自動關閉的Service ###Executor、AsyncTask、HandlerThead、IntentService的選擇 原則:那個簡單用哪一個
- 能用Executor就用Executor
- 須要用到後臺線程推送任務到UI線程時,再考慮AsyncTask或者Handler
- HandlerThread的使用場景:本來它設計的使用場景是在已經運行的指定線程上執行代碼,但現實開發中,除了主線程外,幾乎沒有這種需求,由於HandlerThread和Executor相比在實際應用中並無什麼優點,反而用起來會麻煩些。想用誰就用誰 4.IntentService:首先,它是一個Service;另外,它在處理線程自己,沒有比Executor有任何優點 ###關於Executor和HandlerThread的關閉 若是在界面組件裏建立Executor或者HandlerThread,在關閉時關閉ExeCutor和HandlerThread。
@Override
protected void onDestroy() {
super.onDestroy();
executor.shutdown();
}
複製代碼
@Override
protected void onDestroy() {
super.onDestroy();
// 這個其實就是停⽌ Looper 的循環
handlerThread.quit();
}
複製代碼