1. 程式人生 > >JAVA-初步認識-第十二章-Thread類中的方法線程名稱

JAVA-初步認識-第十二章-Thread類中的方法線程名稱

取名字 在線 初步 read class 創建線程 變化 name 都是

一.

技術分享圖片

技術分享圖片

技術分享圖片

不同的運行,導致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類中的方法線程名稱