將Thread對象作爲Runnable對象使用的結果

review一段代碼,發現一個程序員在提交途任務給ExexutorService時,任務並不是實現Runnable接口而是繼承Thread。

讓其優化,竟然說Thread也是實現Runnable,父類(接口)能使用的地方子類肯定也能使用。

理論沒有錯,能使用但並不代表適用,應該使用Runnable時直接給一個Thread,結果真的一樣嗎?

Runnable僅僅是一個接口,其中只要你實現run方法,它並不有更多的邏輯,你的Runnable提交給ExexutorService它只會找一個已經存在的線程來執行

run中的代碼邏輯,和生產者消費都模式沒有多大區別。但是如果你每次提交Thread對象,雖然它的作用僅僅是作爲Runnable的run方法被調用,並不會

新分配線程,但是構造Thread對象的成本是非常大的,n多的上下文,安全檢查,線程棧的分配。特別是安全性檢查,你可以跟進去看它執行了一大砣一大

砣的邏輯,但最後,你並不把它作爲線程來運行,你只要run方法中的代碼交給ExexutorService中的其它線程來運行,這種overhead的開銷,很多時候比

run中的執行邏輯還大。


所以該用Runnable的時候,千萬不要把Thread傳進去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章