2 回答

TA貢獻1785條經(jīng)驗 獲得超8個贊
首先,啟動另一個線程有2中方式:
實現(xiàn)runnable接口,然后通過Thread的構造函數(shù)把這個類傳給Thread
直接繼承Thread,重寫run方法。
實際啟動線程的時候都是條用的Thread的run()
方法1,將自己已經(jīng)實現(xiàn)Runnable接口的類傳給Thread,那么在調用Thread的run的時候,就會調用你傳入的Runnale的run()
方法2,因為你沒有傳run,所以會調用你自己重寫的Thread的run()方法
方法1與方法2最大的區(qū)別,可能就是方法1采用實現(xiàn)接口的方式,方法2采用繼承的方法。因為java不能多繼承,所以采用方法2以后,就不能再繼承其他類。所以一般推薦使用方法1.
為什么這個strat()函數(shù)不是啟用Thread匿名對象中的run()函數(shù),Thread匿名對象中不是也有run()函數(shù)嗎?
其實這個start()就是啟用Thread自己的run,請看Thread的源代碼:
public void run() { if (target != null ) { target.run(); } } |
這里的target就是你構造Thread的時候傳進來的Runnable對象。所以如果你構造Thread的時候傳了一個Runnable,最終start()是會調用該Runnable的run()的。

TA貢獻1797條經(jīng)驗 獲得超6個贊
因為t已經(jīng)實現(xiàn)了接口Runnable,所以把t當做參數(shù)的時候,其實t已經(jīng)調用了run方法,然后在傳參給Thread(t)整體在調用start函數(shù),運行程序。
添加回答
舉報