天天看點

多線程學習與應用之認識線程

在學習多線程之前,我們有必要老生常談一下線程的基礎知識。

1.什麼是線程

在聊什麼是線程的時候,不得不提另一個名詞——程序。因為線程可以了解為獨立運作在程序中的子任務。

2.線程的使用

線程的使用方式有四種,1 繼承Thread類,2實作Runnable接口,3實作Callable/Future接口。4使用線程池。其中Thread類實作了Runnable接口,Runnable接口實作run方法,而Callable接口實作call方法,run方法無傳回值,call方法允許傳回值

3.線程的狀态,以及狀态之間的流轉

線程共有六種狀态,分别是:

初始化(new):建立了線程對象,但是還未調用start方法。

就緒(ready):就緒是指該線程調用start方法後,等待配置設定cpu的狀态

運作 (running):運作是線程擷取到cpu資源,執行任務的階段。

阻塞(block):線程被鎖阻塞時的狀态

等待(waiting):等待其他線程做出相應操作的階段(例如調用wait,join,park方法,等待其他線程喚醒)

逾時等待(timed_waiting):與等待相比,擁有一個等待時間,超過時間可以自行傳回

終止(terminated):線程執行完畢。

一個線程被建立進入初始化階段,調用start方法後進入就緒狀态,當配置設定到cpu時間片時進入運作狀态,就緒和運作狀态會反複執行,當線程調用遇到鎖(synchronize,sleep)時,進入阻塞狀态,直到擷取到鎖重新進入就緒态,而當遇到wait等方法時進入等待狀态,直到被喚醒才會重新進入就緒狀态,當線程執行完畢後進入終止狀态。狀态流轉如下圖

多線程學習與應用之認識線程

4.與線程有關的常見方法

public static Thread currentThread():擷取目前正在執行的線程。
public static void yield():目前線程讓出時間片,重新進入就緒狀态,與其他就緒線程一起重新競争時間片資源。
public static void sleep(long millis):目前線程暫定執行指定毫秒數,并不會釋放目前持有的資源。
public void start():線程進入就緒狀态(啟動一個新的線程)。
public void run():一般在實作runnable接口或者繼續thread類都需要重寫此方法。當線程進入運作狀态,會執行run方法。public void interrupt():将目前線程狀态設定為中斷。線程實際上并未中斷停止運作。
public static boolean interrupted():判斷目前線程是否中斷,并清除目前線程中斷狀态。(連續兩次調用,第二次傳回false)public boolean isInterrupted():判斷目前線程是否中斷,不清除線程中斷狀态。
public final boolean isAlive():判斷目前線程是否存活。
public final void setDaemon(boolean on):将目前線程設定為守護線程。
public final void setPriority(int newPriority):設定線程優先級,線程共有10個優先級(1-10)優先級越高,被運作的機會越大,線程預設的優先級為5.線程建立時預設繼承目前建立線程的優先級。
public final void join(long millis):等待該線程long 毫秒,如果為0則一直等待,類似于 callable/future