面試題-執行緒
今天公司新來的小夥伴問了我這樣一個面試題:
他不清楚為什麼最後輸出的是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方法即可;
那麼現在,不懂得小夥伴們,瞭解了嗎???