1. 程式人生 > >面試題-執行緒

面試題-執行緒

今天公司新來的小夥伴問了我這樣一個面試題:

他不清楚為什麼最後輸出的是thread中的方法,而不是runnable中的方法,然後我看了下他從網上搜出的別人寫的答案,很多東西對於懂的人來說很容易就能看懂,但是對於剛剛踏入這一行業的人來說,他不明白。所以希望很多在這塊迷茫的小夥伴能夠更好的掌握這一點,那麼我來說一下啊。如有不對的地方,歡迎指正!謝謝!

1,首先我們這樣去分析,

相信大家對於這樣的答案都毫無疑問吧,如果有疑問的話,建議哥們再去看看執行緒方面的基礎知識吧!

現在帶大家看下實現的原理:

     1.1,根據原始碼,我們可以看到:

           

    1.2  呼叫了init方法,其中的target就是我們通過thread建構函式傳遞過來的runnable介面的實現類(包括匿名實現)

      

1.3最終走到這個方法體中,多餘的不看,這個方法中有一個                           

將我們傳遞過來的實現類物件賦值給了Thread中的變數

1.4 賦值完成後,開始執行start方法,最終執行Thread中的run方法:

                 

判斷target是否為空,為空則不執行run方法,不為空則執行實現類中的run方法,即我上面所寫的

              

到這一步,相信不懂的小夥伴應該也有個大致的瞭解了吧.

2 ,對於實現了介面runnable的方式大家應該有些瞭解了,那我們現在看下實現類的

2.1 這一步相當於重寫了Thread中的run方法,從而去執行重寫後的run方法,結果為:上圖所示

3,兩個結合起來:

由於在new Thread後重寫了Thread中的run方法(相當於一個類繼承了Thread,並重寫了Thread的run方法),所以在執行Thread中的start方法時,就不會再走父類的Thread中的方法,而是會走重寫後的run方法,所以這題的輸出結果為:我是thread中的方法

4,那麼問題又來了,如果我想先走介面中的方法,再走自己的方法怎麼辦???

4.1 那也很簡單,這時候只需要呼叫父類中的run方法即可;

那麼現在,不懂得小夥伴們,瞭解了嗎???