JAVA-初步認識-第十二章-Thread類中的方法線程名稱
一.
不同的運行,導致over的位置發生了變化。為什麽呢?我們這裏至少有三個線程。三個線程之間來回隨機切換。
接下來我們想知道的問題就是,我們開啟了多個線程,怎麽區分現在正在運行的線程是誰?多個線程隨機切換,我們怎麽區分。
區分的方法到哪兒找?到thread類中去尋找。線程怎麽區分,線程自己最清楚。
Thread構造函數裏面有一個name,線程有名字。
還有getName獲取名字。現在,我們就來獲取線程的名字(通過名字來區分線程)。(在上面的例子中,我們沒有對線程進行構造函數初始化,直接獲取名字會是什麽樣的呢?)
d1和d2兩個線程在哪兒執行的呢?應該都在run方法裏執行,
在run方法執行的時候,輸出語句中添加了獲取名稱的語句。(Demo是thread的子類,它也就具備父類的方法,來個getName是可以的)
運行之後,確實出現了名稱。名稱就是thread- 加上編號,從0開始編,這個就是線程的名字(說成默認的線程名字比較好),你要是開啟多個的話,就從0開始一直往後遍。(這裏DOS中顯示的被編號的線程是自己創建的線程吧?)
這個編號的出現可能是誰先調用了getName方法,就現在這裏出現編號,按照調用的順序來的。
現在修改程序,將start方法又改回了run方法,
(我覺著這個run的還是主線程操控的,不會有編號的出現。)
d1是主線程執行的,而且d1調用的run方法,也是主線程來執行的,就看主線程在執行run中getName方法時,輸出的線程編碼是什麽?
編譯運行的結果如下:
結果顯示d1的仍舊是thread-0,但由於是主線程執行的,導致旺財輸出是全面而又嚴謹的。(為什麽是thread-0,而不是main?主線程調用run方法,輸出了d1線程的名稱,不是輸出自己的名稱)
現在將兩個對象d1和d2全部改為run方法,
這回編碼依舊沒變,但是全部的代碼都是主線程執行的,順序很嚴謹。
給大家解釋一下,當我們創建兩個線程子類對象的時候,它們在創建的同時已經完成了名稱的定義。
每一個thread子類對象在創建的當時,就已經有了名稱了。但是,我們現在想要知道的是,正在運行的線程的名稱是什麽?
對於下圖的程序,由於子類對象調用的是run方法,所以自己創建的兩個線程並沒有開啟,都是主線程在運行。現在想知道主線程的名字。
怎麽獲取當前運行線程的名字呢?(為什麽要糾結線程的名字呢?僅僅是為了區分多個線程麽?)
繼承體系中的getName是獲取對象的名字。→不對,獲取的是自己創建線程的名稱。對象的名稱是構造初始化,傳遞實參得來的。
想要獲取運行時線程名稱,必須先要得到運行時線程對象(這裏的線程對象和繼承thread子類對象是不一樣的),
在線程類方法當中有一個方法,叫做currentThread(),返回thread類型,靜態的,類名可以直接調用。
接著對原先的程序進行修改,如下圖所示
Thread.currentThread().getName(),這樣寫語法是可以理解的,唯一讓我疑惑的是,為什麽是類名調用時,采用的Thread類,而不是Demo類?
當然編譯的結果顯示,線程名稱就是main
再次修改程序,
DOS結果顯示為三種線程的名稱。
接著提高獲取線程名稱方法的可讀性,復寫該方法。
(這裏在構造函數中輸入實參,怎麽就改變了獲取線程名方法的內容呢?)
在run方法的輸出中是由name的,也有getName方法?
DOS的結果中,null和線程名稱xiaoqiang,旺財怎麽來的?這個流程不是很清楚。
JAVA-初步認識-第十二章-Thread類中的方法線程名稱