多線程的實現有兩種方式,一種是繼承thread,還有一種是實現Runnable接口,推薦使用後者,由於java是單繼承,若是繼承了thread以後,就沒法繼承其餘類了。顯然RUnnable更加靈活一點。java
實現Runnable,比之thread的優點:bash
不管是實現Runnable仍是繼承Thread的方法來實現多線程,他的啓動都是從start開始的,而不是在run方法。若是調用了run,那麼run方法內部的代碼塊實際上仍是執行在當前線程的。數據結構
理由: 當啓動一個線程的時候,操做系統會爲其分配資源,在start方法中不只執行了多線程的代碼,除此還調用了start0方法,該方法的聲明是native額,在java語言中有一種技術叫作jni,即JavaNativeInterface,該技術的特色是調用本機操做系統提供的函數,可是有一個缺點是不能離開特定的操做系統,若是線程須要執行,必須有操做系統去分配資源,因此此操做是JVM根據不一樣的操做系統實現的。多線程
若是多線程是經過實現Runnable來實現的,此時與繼承thread實現有一個區別,那就是Runnable沒有start方法,而多線程必須由start方法啓動,因此這裏必須調用Thread類的一個構造方法Thread(RUnnable target), 該構造方法獲得了Runnable接口的一個實現,因而就能夠經過調用start方法開啓多線程了。ide
消息機制主要指的是Handler的運行機制,它的運行須要底層的MessageQueue和Looper支撐,MessageQueue以隊列的形式對外提供插入和刪除的工做,雖然叫消息隊列,可是其實是採用的單鏈表的數據結構來存儲消息的。函數
實現Runnableoop
class MyRUnnable() : Runnable {
override fun run() {
//...代碼邏輯
val msg: Message = Message.obtain()
handler.post(msg)
}
}
複製代碼
啓動多線程post
val thread = Thread(MyRunnable())
thread.start()
複製代碼
處理多線程的返回spa
val handler = object: Handler() {
override fun handlerMessage(msg: Message?) {
msg?.let {
///...邏輯代碼
}
}
}
複製代碼