線程的建立之繼承Thread類、線程的生命週期、線程經常使用的方法、currentThread方法詳解

1、線程的建立 
一、如何在自定義的代碼中,自定義一個線程呢? 
經過對API文檔的查找,java已經提供了對線程這類事物的描述——Thread類。java

二、建立線程的第一種方式:繼承Thread類。 
1)步驟: 
a)自定義一個類繼承Thread類。 
b)重寫Thread類的run方法 , 把自定義線程的任務代碼寫在run方法中 
目的:將自定義代碼存儲在run方法,讓線程運行。每一個線程都有本身的任務代碼,jvm建立的主線程的任務代碼就是main方法中的全部代碼, 自定義線程的任務代碼就寫在run方法中,自定義線程負責了run方法中代碼。 
c)建立Thread的子類對象,而且調用start方法開啓線程。 
注意:一個線程一旦開啓,那麼線程就會執行run方法中的代碼,run方法千萬不能直接調用,直接調用run方法就至關調用了一個普通的方法而已並無開啓新的線程。 
start()方法的兩個做用:啓動線程,調用run方法。 
舉例: 
多線程

2)發現運行結果每一次都不一樣? 
由於多個線程都在獲取cpu的執行權。cpu執行到誰,誰就運行。明確一點,在某一個時刻,只能有一個程序在運行。(多核除外)cpu在作着快速的切換,以達到看上去是同時運行的效果。 
咱們能夠形象把多線程的運行形容爲多個線程在互相搶奪cpu的執行權。jvm

這就是多線程的一個特性:隨機性。誰搶到誰執行,至於執行多長,cpu說的算。函數

擴展:當CPU符合要求,從單核提升到了雙核甚至多核,這時就要看內存的大小了,若是內存太小,則會出現CPU有處理能力,可是內存不足沒法提供數據進行處理了。 
因此CPU與內存要作當相輔相成。操作系統

3)爲何要覆蓋run方法呢? 
Thread類用於描述線程。該類就定義了一個功能,用於存儲線程要運行的代碼。該存儲功能就是run方法。 
也就是說Thread類中的run方法,用於存儲線程要運行的代碼。線程

4)start、run方法對比,是一個易混淆點: 
MyThread mythread = new MyThread(); 
建立好一個自定義線程。 
a)d.start(); 
開啓線程並執行該線程的run方法。 
b)d.run(); 
僅僅是對象調用方法。而線程建立了,並無運行。code

2、線程的生命週期狀態圖: 
對象

3、線程經常使用的方法: 
一、Thread(String name) 初始化線程的名字 
二、setName(String name) 設置線程對象名 
三、getName() 返回線程的名字 

四、sleep() 線程睡眠指定的毫秒數。 靜態的方法, 哪一個線程執行了sleep方法代碼那麼哪一個線程睡眠。 

五、currentThread() 返回當前的線程對象,該方法是一個靜態的方法。 
注意: 哪一個線程執行了currentThread()代碼就返回那哪一個線程的對象。 

六、 getPriority() 返回當前線程對象的優先級,默認線程的優先級是5。 
七、 setPriority(int newPriority) 設置線程的優先級 
雖然設置了線程的優先級,可是具體的實現取決於底層的操做系統的實現。(最大的優先級是10 ,最小的1 , 默認是5)。 
繼承

4、補充:Thread.currentThread()方法詳解 
一、返回值Thread[Lucy,6,main]生命週期

二、解析: 
1)Lucy:線程名。 
2)6:線程的priority 優先級。 
3)main:線程組的名字。

三、線程組:在Java中每個線程都歸屬於某個線程組管理的一員,例如在主函數main()主工做流程中產生一個線程,則產生的線程屬於main這個線程組管理的一員。

相關文章
相關標籤/搜索