ThreadTest t = new ThreadTest();// ThreadTest已經實現了接口Runnablenew Thread(t).start();請問new Thread(t).start();這句代碼為什么會調用Runnable接口子類對象t中的run()函數?我的理解是因為首先new Thread(t)是先定義了一個Thread線程類的匿名對象,然后這個匿名對象去調用start()函數,為什么這個strat()函數不是啟用Thread匿名對象中的run()函數,Thread匿名對象中不是也有run()函數嗎?而卻調用了Runnable接口子類對象t中的run()函數?雖然t通過構造函數初始化傳遞給Thread的匿名對象,但這有什么關系嗎?上面已經提到 TestThread已經實現了Runnable接口 并且重寫了run()函數,所以肯定是通過public Thread (Runnable target)方式也就是Runnable方式實現多線程,最主要的是我的程序new Thread(t).start()( 也就是這段代碼)最終調用的是TestThread中重寫的run()函數,不是Thread自己的run()函數 ,我不明白為什么?
2 回答

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

FFIVE
TA貢獻1797條經驗 獲得超6個贊
因為t已經實現了接口Runnable,所以把t當做參數的時候,其實t已經調用了run方法,然后在傳參給Thread(t)整體在調用start函數,運行程序。
添加回答
舉報
0/150
提交
取消