亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我不明白為什么代碼會調用Runnable接口子類對象t中的run()函數?

我不明白為什么代碼會調用Runnable接口子類對象t中的run()函數?

泛舟湖上清波郎朗 2022-07-26 15:14:20
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中方式:

  1. 實現runnable接口,然后通過Thread的構造函數把這個類傳給Thread

  2. 直接繼承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()的。


查看完整回答
反對 回復 2022-08-01
?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

因為t已經實現了接口Runnable,所以把t當做參數的時候,其實t已經調用了run方法,然后在傳參給Thread(t)整體在調用start函數,運行程序。

查看完整回答
反對 回復 2022-08-01
  • 2 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號