Thread和Runnable的區別

多線程的實現有兩種方式,一種是繼承thread,還有一種是實現Runnable接口,推薦使用後者,由於java是單繼承,若是繼承了thread以後,就沒法繼承其餘類了。顯然RUnnable更加靈活一點。java

實現Runnable,比之thread的優點:bash

  • 避免因爲java單繼承帶來的侷限性。
  • 相比於繼承thread更能描述數據共享的概念。

不管是實現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 {
            ///...邏輯代碼
        }
    }
}
複製代碼
相關文章
相關標籤/搜索