當前位置:
首頁 > 最新 > Thread源碼剖析

Thread源碼剖析

一、Thread線程類API聲明本文使用的是JDK1.8實現多線程從本質上都是由Thread類來進行操作的~我們來看看Thread類一些重要的知識點。Thread這個類很大,不可能整個把它看下來,只能看一些常見的、重要的方法。1.1設置線程名我們在使用多線程的時候,想要查看線程名是很簡單的,調用Thread.currentThread().getName()即可。

基於這麼一個變數-->線程初始化的數量

點進去看到init方法就可以確定了:

看到這裡,如果我們想要為線程起個名字,那也是很簡單的。Thread給我們提供了構造方法!

當然了,我們還可以通過setName(Stringname)的方法來改掉線程的名字的。我們來看看方法實現;

檢查是否有許可權修改:

至於threadStatus這個狀態屬性,貌似沒發現他會在哪裡修改:

1.2守護線程守護線程是為其他線程服務的垃圾回收線程就是守護線程~守護線程有一個特點:當別的用戶線程執行完了,虛擬機就會退出,守護線程也就會被停止掉了。

原理:這也就為什麼我們要在啟動之前設置守護線程了。

1.3優先順序線程線程優先順序高僅僅表示線程獲取的CPU時間片的幾率高,但這不是一個確定的因素!線程的優先順序是高度依賴於操作系統的,Windows和Linux就有所區別(Linux下優先順序可能就被忽略了)~可以看到的是,Java提供的優先順序默認是5,最低是1,最高是10:

實現:

setPriority0是一個本地(navite)的方法:privatenativevoidsetPriority0(intnewPriority);1.4線程生命周期在上一篇介紹的時候其實也提過了線程的線程有3個基本狀態:執行、就緒、阻塞在Java中我們就有了這個圖,Thread上很多的方法都是用來切換線程的狀態的,這一部分是重點!

其實上面這個圖是不夠完整的,省略掉了一些東西。後面在講解的線程狀態的時候我會重新畫一個~下面就來講解與線程生命周期相關的方法~1.4.1sleep方法調用sleep方法會進入計時等待狀態,等時間到了,進入的是就緒狀態而並非是運行狀態!

於是乎,我們的圖就可以補充成這樣:

1.4.2yield方法調用yield方法會先讓別的線程執行,但是不確保真正讓出意思是:我有空,可以的話,讓你們先執行

於是乎,我們的圖就可以補充成這樣:

1.4.3join方法調用join方法,會等待該線程執行完畢後才執行別的線程~

wait方法是在Object上定義的,它是native本地方法,所以就看不了了:

wait方法實際上它也是**計時等待(如果帶時間參數)**的一種!,於是我們可以補充我們的圖:

1.4.3interrupt方法線程中斷在之前的版本有stop方法,但是被設置過時了。現在已經沒有強制線程終止的方法了!由於stop方法可以讓一個線程A終止掉另一個線程B被終止的線程B會立即釋放鎖,這可能會讓對象處於不一致的狀態。

再來看看剛才說拋出的異常是什麼東東吧:

所以說:interrupt方法壓根是不會對線程的狀態造成影響的,它僅僅設置一個標誌位罷了interrupt線程中斷還有另外兩個方法(檢查該線程是否被中斷):靜態方法interrupted()-->會清除中斷標誌位實例方法isInterrupted()-->不會清除中斷標誌位

上面還提到了,如果阻塞線程調用了interrupt()方法,那麼會拋出異常,設置標誌位為false,同時該線程會退出阻塞的。

接下來我們分析它的執行流程是怎麼樣的:


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 韶齊愛寵物 的精彩文章:

TAG:韶齊愛寵物 |