今天公司新來的小夥伴問了我這樣乙個面試題:
他不清楚為什麼最後輸出的是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方法即可;
那麼現在,不懂得小夥伴們,了解了嗎???
多執行緒面試題
題目 主線程執行10次,子執行緒執行10次,此過程重複50次 package com.thread.test function 主線程執行10次,子執行緒執行10次,此過程重複50次 public class threadproblem start for int j 0 j 50 j class ...
面試題 多執行緒
現有程式同時啟動了4個執行緒去呼叫testdo.dosome key,value 方法,由於testdo.dosome key,value 方法內的 是先暫停1秒,然後再輸出以秒為單位的當前時間值,所以,會列印出4個相同的時間值,如下所示 4 4 1258199615 1 1 1258199615 ...
Java 執行緒面試題
子執行緒迴圈10次,接著主線程迴圈100次,接著又回到子執行緒迴圈10次,接著再回到主線程又迴圈100次,如此迴圈50次,請寫出程式。互斥實現了,就是交替執行弄不出來。子執行緒迴圈10次,接著主線程迴圈100次,接著又回到子執行緒迴圈10次,接著再回到主線程又迴圈100次,如此迴圈50次,請寫出程式...