第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

泛舟湖上清波郎朗 2022-07-26 15:14:20
ThreadTest t = new ThreadTest();// ThreadTest已經(jīng)實現(xiàn)了接口Runnablenew Thread(t).start();請問new Thread(t).start();這句代碼為什么會調用Runnable接口子類對象t中的run()函數(shù)?我的理解是因為首先new Thread(t)是先定義了一個Thread線程類的匿名對象,然后這個匿名對象去調用start()函數(shù),為什么這個strat()函數(shù)不是啟用Thread匿名對象中的run()函數(shù),Thread匿名對象中不是也有run()函數(shù)嗎?而卻調用了Runnable接口子類對象t中的run()函數(shù)?雖然t通過構造函數(shù)初始化傳遞給Thread的匿名對象,但這有什么關系嗎?上面已經(jīng)提到 TestThread已經(jīng)實現(xiàn)了Runnable接口 并且重寫了run()函數(shù),所以肯定是通過public Thread (Runnable target)方式也就是Runnable方式實現(xiàn)多線程,最主要的是我的程序new Thread(t).start()( 也就是這段代碼)最終調用的是TestThread中重寫的run()函數(shù),不是Thread自己的run()函數(shù) ,我不明白為什么?
查看完整描述

2 回答

?
慕的地10843

TA貢獻1785條經(jīng)驗 獲得超8個贊

首先,啟動另一個線程有2中方式:

  1. 實現(xiàn)runnable接口,然后通過Thread的構造函數(shù)把這個類傳給Thread

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


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

TA貢獻1797條經(jīng)驗 獲得超6個贊

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

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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號