1. 程式人生 > >Java多執行緒程式設計總結筆記——02多執行緒基礎知識

Java多執行緒程式設計總結筆記——02多執行緒基礎知識

讀解Thread類API

構造方法摘要

Thread(Runnable target)

分配新的 Thread 物件。

Thread(String name)

分配新的 Thread 物件。

方法摘要

static Thread currentThread()

返回對當前正在執行的執行緒物件的引用。

 ClassLoader getContextClassLoader()

返回該執行緒的上下文 ClassLoader。

 long getId()

返回該執行緒的識別符號。

 String getName()

返回該執行緒的名稱。

 int getPriority()

返回執行緒的優先順序。

 Thread.State getState()

返回該執行緒的狀態。

 ThreadGroup getThreadGroup()

返回該執行緒所屬的執行緒組。

static boolean holdsLock(Object obj)

當且僅當當前執行緒在指定的物件上保持監視器鎖時,才返回true。

 void interrupt()

中斷執行緒。

static boolean interrupted()

測試當前執行緒是否已經中斷。

 boolean isAlive()

測試執行緒是否處於活動狀態。

 boolean isDaemon()

測試該執行緒是否為守護執行緒。

 boolean isInterrupted()

測試執行緒是否已經中斷。

 void join()

等待該執行緒終止。

 void join(long millis)

等待該執行緒終止的時間最長為 millis 毫秒。

 void join(long millis, int nanos)

等待該執行緒終止的時間最長為 millis 毫秒 + nanos 納秒。

 void resume()

已過時。該方法只與 suspend() 一起使用,但 suspend() 已經遭到反對,因為它具有死鎖傾向。

 void run()

如果該執行緒是使用獨立的 Runnable 執行物件構造的,則呼叫該 Runnable 物件的 run 方法;否則,該方法不執行任何操作並返回。

 void setContextClassLoader(ClassLoader cl)

設定該執行緒的上下文 ClassLoader。

 void setDaemon(boolean on)

將該執行緒標記為守護執行緒或使用者執行緒。

static voidsetDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

設定當執行緒由於未捕獲到異常而突然終止,並且沒有為該執行緒定義其他處理程式時所呼叫的預設處理程式。

 void setName(String name)

改變執行緒名稱,使之與引數 name 相同。

 void setPriority(int newPriority)

更改執行緒的優先順序。

 void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

設定該執行緒由於未捕獲到異常而突然終止時呼叫的處理程式。

static void sleep(long millis)

在指定的毫秒數內讓當前正在執行的執行緒休眠(暫停執行)。

static void sleep(long millis, int nanos)

在指定的毫秒數加指定的納秒數內讓當前正在執行的執行緒休眠(暫停執行)。

 void start()

使該執行緒開始執行;Java 虛擬機器呼叫該執行緒的 run 方法。

 void stop()

已過時。該方法具有固有的不安全性。

 void stop(Throwable obj)

已過時。該方法具有固有的不安全性。

 void suspend()

已過時。該方法已經遭到反對,因為它具有固有的死鎖傾向。

 String toString()

返回該執行緒的字串表示形式,包括執行緒名稱、優先順序和執行緒組。

static void yield()

暫停當前正在執行的執行緒物件,並執行其他執行緒。

執行緒的狀態轉換圖

1、新建狀態(New):新建立了一個執行緒物件。

2、就緒狀態(Runnable):執行緒物件建立後,其他執行緒呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取CPU的使用權。

3、執行狀態(Running):就緒狀態的執行緒獲取了CPU,執行程式程式碼。

4、阻塞狀態(Blocked):阻塞狀態是執行緒因為某種原因放棄CPU使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。阻塞的情況分三種:

(一)、等待阻塞:執行的執行緒執行wait()方法,JVM會把該執行緒放入等待池中。

(二)、同步阻塞:執行的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒佔用,則JVM會把該執行緒放入鎖池中。

(三)、其他阻塞:執行的執行緒執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該執行緒置為阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者I/O處理完畢時,執行緒重新轉入就緒狀態。

5、死亡狀態(Dead):執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。

執行緒的排程

Java執行緒的優先順序用整數表示,取值範圍是1~10,Thread類有以下三個靜態常量:

static int MAX_PRIORITY

執行緒可以具有的最高優先順序,取值為10。

static int MIN_PRIORITY

執行緒可以具有的最低優先順序,取值為1。

static int NORM_PRIORITY

分配給執行緒的預設優先順序,取值為5。

每個執行緒都有預設的優先順序。主執行緒的預設優先順序為Thread.NORM_PRIORITY。

執行緒的優先順序有繼承關係,比如A執行緒中建立了B執行緒,那麼B將和A具有相同的優先順序。

JVM提供了10個執行緒優先順序,但與常見的作業系統都不能很好的對映。如果希望程式能移植到各個作業系統中,應該僅僅使用Thread類有以下三個靜態常量作為優先順序,這樣能保證同樣的優先順序採用了同樣的排程方式。

執行緒等待:Object類中的wait()方法,導致當前的執行緒等待,直到其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 喚醒方法。這個兩個喚醒方法也是Object類中的方法,行為等價於呼叫 wait(0) 一樣。

執行緒睡眠:Thread.sleep(long millis)方法,使執行緒轉到阻塞狀態。millis引數設定睡眠的時間,以毫秒為單位。當睡眠結束後,就轉為就緒(Runnable)狀態。sleep()平臺移植性好。

執行緒讓步:Thread.yield() 方法,暫停當前正在執行的執行緒物件,把執行機會讓給相同或者更高優先順序的執行緒。

執行緒加入:join()方法,等待其他執行緒終止。在當前執行緒中呼叫另一個執行緒的join()方法,則當前執行緒轉入阻塞狀態,直到另一個程序執行結束,當前執行緒再由阻塞轉為就緒狀態。
執行緒喚醒:Object類中的notify()方法,喚醒在此物件監視器上等待的單個執行緒。如果所有執行緒都在此物件上等待,則會選擇喚醒其中一個執行緒。選擇是任意性的,並在對實現做出決定時發生。執行緒通過呼叫其中一個 wait 方法,在物件的監視器上等待。 直到當前的執行緒放棄此物件上的鎖定,才能繼續執行被喚醒的執行緒。被喚醒的執行緒將以常規方式與在該物件上主動同步的其他所有執行緒進行競爭;例如,喚醒的執行緒在作為鎖定此物件的下一個執行緒方面沒有可靠的特權或劣勢。類似的方法還有一個notifyAll(),喚醒在此物件監視器上等待的所有執行緒。

後臺執行緒:指為其他執行緒提供服務的執行緒,也稱為守護執行緒。JVM的垃圾回收執行緒就是一個後臺執行緒。

前臺執行緒:是指接受後臺執行緒服務的執行緒,其實前臺後臺執行緒是聯絡在一起,就像傀儡和幕後操縱者一樣的關係。傀儡是前臺執行緒、幕後操縱者是後臺執行緒。由前臺執行緒建立的執行緒預設也是前臺執行緒。可以通過isDaemon()和setDaemon()方法來判斷和設定一個執行緒是否為後臺執行緒。