java多執行緒之Thread類

博弈發表於2019-01-19

Class Thread

java.lang.Object
     java.lang.Thread

實現介面:Runnable
直接被繼承的子類:ForkJoinWorkerThread


public class Thread
extends Object
implements Runnable

thread是程式中的執行執行緒,Java虛擬機器允許應用程式同時執行多個執行執行緒。

每個執行緒都有一個優先順序,優先順序較高的執行緒優先於優先順序較低的執行緒執行,每個執行緒都可能被標記為一個守護執行緒。當在某個執行緒中執行的程式碼建立一個新的執行緒物件時,新執行緒的優先順序初始設定為建立它的執行緒的優先順序,並且當且僅當建立它的執行緒是一個守護執行緒時,它是一個守護執行緒。

當Java虛擬機器啟動時,通常只有一個非守護執行緒(通常稱為某些指定類的main方法),Java虛擬機器繼續執行執行緒,直到發生以下任何一種情況:

  • 類的exit方法在執行時被呼叫,並且安全管理器允許exit操作發生。
  • 所有非守護執行緒都已死亡,要麼從呼叫run方法那裡返回,要麼丟擲一個傳播到run方法之外的異常。

有兩種方法可以建立一個新的執行執行緒,一種方法是將類宣告為Thread的子類,這個子類應該重寫類Threadrun方法,然後可以分配並啟動子類的一個例項。例如,一個計算大於指定值的素數的執行緒可以這樣寫:

class PrimeThread extends Thread {
    PrimeThread(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
          . . .
    }
}

下面的程式碼將建立一個執行緒並啟動執行:

PrimeThread p = new PrimeThread(143);
p.start();

另一種建立執行緒的方法是宣告實現Runnable介面的類,該類實現run方法,然後可以分配類的一個例項,在建立執行緒時作為引數傳遞,並啟動。另一種風格中的相同示例如下:

class PrimeRun implements Runnable {
    long minPrime;
    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
          . . .
    }
}

下面的程式碼將建立一個執行緒並啟動執行:

PrimeRun p = new PrimeRun(143);
new Thread(p).start();

每個執行緒都有一個用於標識的名稱,多個執行緒可能具有相同的名稱,如果在建立執行緒時沒有指定名稱,將為它生成一個新名稱。

除非另外註明,將null引數傳遞給該類的建構函式或方法將導致丟擲NullPointerException

自:JDK1.0,相關類和方法:RunnableRuntime.exit(int)run()stop()

內嵌類彙總

static class Thread.State

  • 執行緒的狀態

static interface Thread.UncaughtExceptionHandler

  • 當執行緒因未捕獲異常而突然終止時呼叫的處理程式的介面

欄位彙總

static int MAX_PRIORITY

  • 執行緒可以擁有的最大優先順序

static int MIN_PRIORITY

  • 執行緒可以擁有的最小優先順序

static int NORM_PRIORITY

  • 分配給執行緒的預設優先順序

建構函式彙總

Thread()

  • 分配一個新的執行緒物件

Thread(Runnable target)

  • 分配一個新的執行緒物件,使其具有target作為其執行物件

Thread(Runnable target, String name)

  • 分配一個新的執行緒物件,使其具有target作為其執行物件,並具有指定的name作為其名稱

Thread(String name)

  • 分配一個新的執行緒物件,具有指定的name作為其名稱

Thread(ThreadGroup group, Runnable target)

  • 分配一個新的執行緒物件,使其具有target作為其執行物件,並且屬於group引用的執行緒組

Thread(ThreadGroup group, Runnable target, String name)

  • 分配一個新的執行緒物件,使其具有target作為其執行物件,具有指定的name作為其名稱,並且屬於group引用的執行緒組

Thread(ThreadGroup group, Runnable target, String name, long stackSize)

  • 分配一個新的執行緒物件,使其具有target作為其執行物件,具有指定的name作為其名稱,並且屬於由group引用的執行緒組,並具有指定的堆疊大小。

Thread(ThreadGroup group, String name)

  • 分配一個新的執行緒物件,具有指定的name作為其名稱,並且屬於由group引用的執行緒組

方法彙總

static int activeCount()

  • 返回當前執行緒組及其子組中活動執行緒的數量的估算

void checkAccess()

  • 確定當前執行的執行緒是否具有修改該執行緒的許可權

protected Object clone()

  • 一個執行緒被沒有意義的克隆將丟擲CloneNotSupportedException

int countStackFrames()

  • 已廢棄。這個呼叫的定義依賴於suspend(),它已被廢棄,此外,這個呼叫的結果從來沒有明確的定義

static Thread currentThread()

  • 返回對當前執行的執行緒物件的引用

void destroy()

  • 已廢棄。此方法最初設計為在不進行任何清理的情況下銷燬此執行緒,它所持有的任何監視器都將保持鎖定狀態,然而,該方法從未實現,如果要實現的話,它很可能會像suspend()那樣出現死鎖。如果目標執行緒在被銷燬時持有保護關鍵系統資源的鎖,則沒有執行緒可以再次訪問該資源,如果另一個執行緒試圖鎖定該資源,則會導致死鎖。這種死鎖通常表現為“凍結”程式。

static void dumpStack()

  • 將當前執行緒的堆疊跟蹤列印到標準錯誤流

static int enumerate(Thread[] tarray)

  • 將當前執行緒組及其子組中的每個活動執行緒複製到指定的陣列中

static Map<Thread,StackTraceElement[]> getAllStackTraces()

  • 返回所有活動執行緒的堆疊跟蹤map

ClassLoader getContextClassLoader()

  • 返回該執行緒的上下文類載入器

static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()

  • 返回由於未捕獲異常而突然終止的執行緒時呼叫的預設處理程式

long getId()

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

String getName()

  • 返回該執行緒的名字

int getPriority()

  • 返回該執行緒的優先順序

StackTraceElement[] getStackTrace()

  • 返回表示該執行緒堆疊轉儲的堆疊跟蹤元素的陣列

Thread.State getState()

  • 返回此執行緒的狀態

ThreadGroup getThreadGroup()

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

Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()

  • 返回由於未捕獲異常而突然終止此執行緒時呼叫的處理程式

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(),因為它容易死鎖,所以已被棄用。

void run()

  • 如果這個執行緒是使用一個單獨的Runnable run物件構造的,那麼將呼叫該Runnable物件的run方法,否則,此方法將不執行任何操作並返回。

void setContextClassLoader(ClassLoader cl)

  • 設定此執行緒的上下文類載入器

void setDaemon(boolean on)

  • 將此執行緒標記為守護執行緒或使用者執行緒

static void setDefaultUncaughtExceptionHandler(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()

  • 已廢棄。這個方法本質上是不安全的,使用Thread.stop停止一個執行緒會使它解鎖它已鎖定的所有監視器(作為未檢查的ThreadDeath異常向堆疊傳播的自然結果),如果這些監視器之前保護的任何物件處於不一致的狀態,則損壞的物件會對其他執行緒可見,從而可能導致任意行為。應該用簡單地修改某些變數以表明目標執行緒應該停止執行的程式碼來替換stop的許多用法。目標執行緒應該定期檢查這個變數,如果該變數表明它將停止執行,則以有序的方式從它的run方法返回。如果目標執行緒等待很長時間(例如,在條件變數上),則應該使用中斷方法來中斷等待。

void stop(Throwable obj)

  • 已廢棄。這種方法最初的目的是迫使執行緒停止並丟擲一個給定的可丟擲的異常,它本質上是不安全的(參見stop()),而且還可以用於生成目標執行緒不準備處理的異常。

void suspend()

  • 已廢棄。這個方法已經被棄用,因為它天生就容易死鎖。如果目標執行緒在監視器上持有鎖,以保護掛起的關鍵系統資源,則在目標執行緒恢復之前,沒有執行緒可以訪問該資源。如果要恢復目標執行緒的執行緒試圖在呼叫resume之前鎖定此監視器,則會導致死鎖。這種死鎖通常表現為“凍結”程式。

String toString()

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

static void yield()

  • 給排程器的一個提示,說明當前執行緒願意提供當前對處理器的使用

從類java.lang.Object繼承的方法

equals, finalize, getClass, hashCode, notify, notifyAll, wait

欄位的細節

MIN_PRIORITY

public static final int MIN_PRIORITY = 1

執行緒可以擁有的最小優先順序。


NORM_PRIORITY

public static final int NORM_PRIORITY = 5

分配給執行緒的預設優先順序。


MAX_PRIORITY

public static final int MAX_PRIORITY = 10

執行緒可以擁有的最大優先順序。

建構函式的細節

Thread

public Thread()

分配一個新的執行緒物件,這個建構函式具有與Thread (null, null, gname)相同的效果,其中gname是一個新生成的名稱,自動生成的名稱為“Thread-”+n形式,其中n為整數。


Thread

public Thread(Runnable target)

分配一個新的執行緒物件,這個建構函式具有與Thread (null, target, gname)相同的效果,其中gname是一個新生成的名稱,自動生成的名稱為“Thread-”+n形式,其中n為整數。

引數
target – 在啟動該執行緒時呼叫其run方法的物件,如果為null,這個類run方法什麼都不做。


Thread

public Thread(ThreadGroup group, Runnable target)

分配一個新的執行緒物件,這個建構函式具有與Thread (group, target, gname)相同的效果,其中gname是一個新生成的名稱,自動生成的名稱為“Thread-”+n形式,其中n為整數。

引數
group – 執行緒組,如果null並且有一個安全管理器,那麼組由SecurityManager.getThreadGroup()決定,如果沒有安全管理器或SecurityManager.getThreadGroup()返回null,則將組設定為當前執行緒的執行緒組。
target – 在啟動該執行緒時呼叫其run方法的物件,如果為null,這個類run方法什麼都不做。
Throws:
SecurityException – 如果當前執行緒不能在指定的執行緒組中建立執行緒。

相關文章