鴻蒙OS Thread

2022-05-26 17:12 更新

Thread

java.lang.Object

|---java.lang.Thread

public class Thread
extends Object
implements Runnable

線程是程序中的執(zhí)行線程。 Java 虛擬機(jī)允許應(yīng)用程序同時運(yùn)行多個執(zhí)行線程。

每個線程都有一個優(yōu)先級。具有較高優(yōu)先級的線程優(yōu)先于具有較低優(yōu)先級的線程執(zhí)行。每個線程可能會也可能不會被標(biāo)記為守護(hù)進(jìn)程。當(dāng)在某個線程中運(yùn)行的代碼創(chuàng)建一個新的 Thread 對象時,新線程的優(yōu)先級最初設(shè)置為等于創(chuàng)建線程的優(yōu)先級,并且當(dāng)且僅當(dāng)創(chuàng)建線程是守護(hù)進(jìn)程時,它才是守護(hù)線程。

當(dāng) Java 虛擬機(jī)啟動時,通常有一個非守護(hù)線程(通常調(diào)用某個指定類的名為 main 的方法)。 Java 虛擬機(jī)繼續(xù)執(zhí)行線程,直到發(fā)生以下任一情況:

  • 已調(diào)用 Runtime 類的退出方法,并且安全管理器已允許進(jìn)行退出操作。
  • 所有不是守護(hù)線程的線程都已經(jīng)死亡,要么從調(diào)用 run 方法返回,要么拋出傳播到 run 方法之外的異常。

有兩種方法可以創(chuàng)建一個新的執(zhí)行線程。一種是將類聲明為 Thread 的子類。這個子類應(yīng)該重寫類 Thread 的 run 方法。然后可以分配和啟動子類的實(shí)例。例如,計(jì)算大于規(guī)定值的素?cái)?shù)的線程可以寫成如下:

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


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

 

下面的代碼將創(chuàng)建一個線程并開始運(yùn)行:

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

 

創(chuàng)建線程的另一種方法是聲明一個實(shí)現(xiàn) Runnable 接口的類。 然后該類實(shí)現(xiàn) run 方法。 然后可以分配一個類的實(shí)例,在創(chuàng)建線程時作為參數(shù)傳遞,然后啟動。 這種其他樣式的相同示例如下所示:

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


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

 

下面的代碼將創(chuàng)建一個線程并開始運(yùn)行:

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

 

每個線程都有一個用于識別目的的名稱。 多個線程可能具有相同的名稱。 如果在創(chuàng)建線程時未指定名稱,則會為其生成一個新名稱。

除非另有說明,否則將 null 參數(shù)傳遞給此類中的構(gòu)造函數(shù)或方法將導(dǎo)致拋出 NullPointerException。

嵌套類摘要

修飾符和類型 描述
static class Thread.State 線程狀態(tài)。
static interface Thread.UncaughtExceptionHandler 當(dāng)線程由于未捕獲的異常而突然終止時調(diào)用的處理程序接口。

字段摘要

修飾符和類型 字段 描述
static int MAX_PRIORITY 線程可以擁有的最大優(yōu)先級。
static int MIN_PRIORITY 線程可以擁有的最低優(yōu)先級。
static int NORM_PRIORITY 分配給線程的默認(rèn)優(yōu)先級。

構(gòu)造函數(shù)摘要

構(gòu)造函數(shù) 描述
Thread() 分配一個新的 Thread 對象。
Thread(Runnable target) 分配一個新的 Thread 對象。
Thread(Runnable target, String name) 分配一個新的 Thread 對象。
Thread(String name) 分配一個新的 Thread 對象。
Thread(ThreadGroup group, Runnable target) 分配一個新的 Thread 對象。
Thread(ThreadGroup group, Runnable target, String name) 分配一個新的 Thread 對象,使其以 target 作為其運(yùn)行對象,以指定的名稱作為其名稱,并屬于 group 所引用的線程組。
Thread(ThreadGroup group, Runnable target, String name, long stackSize) 分配一個新的 Thread 對象,使其以 target 作為其運(yùn)行對象,以指定的名稱作為其名稱,并屬于由 group 引用的線程組,并具有指定的堆棧大小。
Thread(ThreadGroup group, String name) 分配一個新的 Thread 對象。

方法總結(jié)

修飾符和類型 方法 描述
static int activeCount() 返回當(dāng)前線程的線程組及其子組中活動線程數(shù)的估計(jì)值。
void checkAccess() 確定當(dāng)前運(yùn)行的線程是否有權(quán)修改該線程。
protected Object clone() 拋出 CloneNotSupportedException,因?yàn)?nbsp;Thread 不能被有意義地克隆。
int countStackFrames() 已棄用。 此調(diào)用的定義取決于已棄用的suspend()。 此外,此調(diào)用的結(jié)果從未明確定義。
static Thread currentThread() 返回對當(dāng)前正在執(zhí)行的線程對象的引用。
void destroy() 已棄用。 此方法最初設(shè)計(jì)用于在不進(jìn)行任何清理的情況下銷毀此線程。 它持有的任何監(jiān)視器都將保持鎖定狀態(tài)。 但是,該方法從未實(shí)施。 如果要實(shí)現(xiàn)的話,它會像suspend()那樣容易死鎖。 如果目標(biāo)線程在關(guān)鍵系統(tǒng)資源被銷毀時持有保護(hù)它的鎖,則沒有線程可以再次訪問該資源。 如果另一個線程曾經(jīng)試圖鎖定這個資源,就會導(dǎo)致死鎖。 這種死鎖通常表現(xiàn)為“凍結(jié)”進(jìn)程。
static void dumpStack() 將當(dāng)前線程的堆棧跟蹤打印到標(biāo)準(zhǔn)錯誤流。
static int enumerate(Thread[] tarray) 將當(dāng)前線程的線程組及其子組中的每個活動線程復(fù)制到指定的數(shù)組中。
static MapThread,StackTraceElement[] getAllStackTraces() 返回所有活動線程的堆棧跟蹤映射。
ClassLoader getContextClassLoader() 返回此線程的上下文 ClassLoader。
static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler() 返回當(dāng)線程由于未捕獲的異常而突然終止時調(diào)用的默認(rèn)處理程序。
long getId() 返回此線程的標(biāo)識符。
String getName() 返回此線程的名稱。
int getPriority() 返回此線程的優(yōu)先級。
StackTraceElement[] getStackTrace() 返回表示此線程的堆棧轉(zhuǎn)儲的堆棧跟蹤元素?cái)?shù)組。
Thread.State getState() 返回此線程的狀態(tài)。
ThreadGroup getThreadGroup() 返回該線程所屬的線程組。
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() 返回當(dāng)此線程由于未捕獲的異常而突然終止時調(diào)用的處理程序。
static boolean holdsLock(Object obj) 當(dāng)且僅當(dāng)當(dāng)前線程持有指定對象上的監(jiān)視器鎖時才返回 true。
void interrupt() 中斷這個線程。
static boolean interrupted() 測試當(dāng)前線程是否被中斷。
boolean isAlive() 測試此線程是否存在。
boolean isDaemon() 測試此線程是否為守護(hù)線程。
boolean isInterrupted() 測試此線程是否已被中斷。
void join() 等待這個線程死掉。
void join(long millis) 最多等待幾毫秒讓該線程終止。
void join(long millis, int nanos) 最多等待毫秒加上納秒以使該線程終止。
void resume() 已棄用。 此方法僅用于與suspend() 一起使用,該方法已被棄用,因?yàn)樗菀装l(fā)生死鎖。
void run() 如果該線程是使用單獨(dú)的 Runnable 運(yùn)行對象構(gòu)造的,則調(diào)用該 Runnable 對象的 run 方法; 否則,此方法不執(zhí)行任何操作并返回。
void setContextClassLoader(ClassLoader cl) 設(shè)置此線程的上下文 ClassLoader。
void setDaemon(boolean on) 將此線程標(biāo)記為守護(hù)線程或用戶線程。
static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 設(shè)置當(dāng)線程由于未捕獲的異常而突然終止時調(diào)用的默認(rèn)處理程序,并且沒有為該線程定義其他處理程序。
void setName(String name) 將此線程的名稱更改為等于參數(shù)名稱。
void setPriority(int newPriority) 更改此線程的優(yōu)先級。
void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 設(shè)置當(dāng)此線程由于未捕獲的異常而突然終止時調(diào)用的處理程序。
static void sleep(long millis) 使當(dāng)前執(zhí)行的線程在指定的毫秒數(shù)內(nèi)休眠(暫時停止執(zhí)行),具體取決于系統(tǒng)計(jì)時器和調(diào)度程序的精度和準(zhǔn)確性。
static void sleep(long millis, int nanos) 使當(dāng)前執(zhí)行的線程休眠(暫時停止執(zhí)行)指定的毫秒數(shù)加上指定的納秒數(shù),具體取決于系統(tǒng)計(jì)時器和調(diào)度程序的精度和準(zhǔn)確性。
void start() 使該線程開始執(zhí)行; Java 虛擬機(jī)調(diào)用該線程的 run 方法。
void stop() 已棄用。 這種方法本質(zhì)上是不安全的。 使用 Thread.stop 停止線程會導(dǎo)致它解鎖所有已鎖定的監(jiān)視器(這是未經(jīng)檢查的 ThreadDeath 異常沿堆棧傳播的自然結(jié)果)。 如果以前受這些監(jiān)視器保護(hù)的任何對象處于不一致狀態(tài),則損壞的對象將對其他線程可見,從而可能導(dǎo)致任意行為。 停止的許多用法應(yīng)該由簡單地修改一些變量以指示目標(biāo)線程應(yīng)該停止運(yùn)行的代碼替換。 目標(biāo)線程應(yīng)該定期檢查這個變量,如果變量指示它要停止運(yùn)行,則以有序的方式從它的run方法返回。 如果目標(biāo)線程等待很長時間(例如在條件變量上),則應(yīng)使用中斷方法來中斷等待。
void stop(Throwable obj) 已棄用。 此方法最初旨在強(qiáng)制線程停止并將給定的 Throwable 作為異常拋出。 它本質(zhì)上是不安全的(有關(guān)詳細(xì)信息,請參閱 stop()),此外,它還可用于生成目標(biāo)線程未準(zhǔn)備好處理的異常。
void suspend() 已棄用。 此方法已被棄用,因?yàn)樗举|(zhì)上容易死鎖。 如果目標(biāo)線程在暫停時對保護(hù)關(guān)鍵系統(tǒng)資源的監(jiān)視器持有鎖,則在目標(biāo)線程恢復(fù)之前沒有線程可以訪問該資源。 如果將恢復(fù)目標(biāo)線程的線程在調(diào)用 resume 之前嘗試鎖定此監(jiān)視器,則會導(dǎo)致死鎖。 這種死鎖通常表現(xiàn)為“凍結(jié)”進(jìn)程。
String toString() 返回此線程的字符串表示形式,包括線程的名稱、優(yōu)先級和線程組。
static void yield() 向調(diào)度程序提示當(dāng)前線程愿意放棄其當(dāng)前對處理器的使用。
從類 java.lang.Object 繼承的方法
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

字段詳細(xì)信息

MAX_PRIORITY

public static final int MAX_PRIORITY

線程可以擁有的最大優(yōu)先級。

MIN_PRIORITY

public static final int MIN_PRIORITY

線程可以擁有的最低優(yōu)先級。

NORM_PRIORITY

public static final int NORM_PRIORITY

分配給線程的默認(rèn)優(yōu)先級。

構(gòu)造函數(shù)詳細(xì)信息

Thread

public Thread()

分配一個新的 Thread 對象。 此構(gòu)造函數(shù)與 Thread (null, null, gname) 的效果相同,其中 gname 是新生成的名稱。 自動生成的名稱格式為“Thread-”+n,其中 n 是整數(shù)。

Thread

public Thread(Runnable target)

分配一個新的 Thread 對象。 此構(gòu)造函數(shù)與 Thread (null, target, gname) 的效果相同,其中 gname 是新生成的名稱。 自動生成的名稱格式為“Thread-”+n,其中 n 是整數(shù)。

參數(shù):

參數(shù)名稱 參數(shù)描述
target 此線程啟動時調(diào)用其 run 方法的對象。 如果為 null,則此類 run 方法不執(zhí)行任何操作。

Thread

public Thread(ThreadGroup group, Runnable target)

分配一個新的 Thread 對象。 此構(gòu)造函數(shù)與 Thread (group, target, gname) 具有相同的效果,其中 gname 是新生成的名稱。 自動生成的名稱格式為“Thread-”+n,其中 n 是整數(shù)。

參數(shù):

參數(shù)名稱 參數(shù)描述
group 線程組。 如果為 null 并且存在安全管理器,則該組由 SecurityManager#getThreadGroup 確定。 如果沒有安全管理器或 SecurityManager.getThreadGroup() 返回 null,則將該組設(shè)置為當(dāng)前線程的線程組。
target 此線程啟動時調(diào)用其 run 方法的對象。 如果為 null,則調(diào)用此線程的 run 方法。

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程無法在指定線程組中創(chuàng)建線程

Thread

public Thread(String name)

分配一個新的 Thread 對象。 此構(gòu)造函數(shù)與 Thread (null, null, name) 具有相同的效果。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 新線程的名稱

Thread

public Thread(ThreadGroup group, String name)

分配一個新的 Thread 對象。 此構(gòu)造函數(shù)與 Thread (group, null, name) 具有相同的效果。

參數(shù):

參數(shù)名稱 參數(shù)描述
group 線程組。 如果為 null 并且存在安全管理器,則該組由 SecurityManager#getThreadGroup 確定。 如果沒有安全管理器或 SecurityManager.getThreadGroup() 返回 null,則將該組設(shè)置為當(dāng)前線程的線程組。
name 新線程的名稱

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程無法在指定線程組中創(chuàng)建線程

Thread

public Thread(Runnable target, String name)

分配一個新的 Thread 對象。 此構(gòu)造函數(shù)與 Thread (null, target, name) 具有相同的效果。

參數(shù):

參數(shù)名稱 參數(shù)描述
target 此線程啟動時調(diào)用其 run 方法的對象。 如果為 null,則調(diào)用此線程的 run 方法。
name 新線程的名稱

Thread

public Thread(ThreadGroup group, Runnable target, String name)

分配一個新的 Thread 對象,使其以 target 作為其運(yùn)行對象,以指定的名稱作為其名稱,并屬于 group 所引用的線程組。

如果有安全管理器,則使用 ThreadGroup 作為其參數(shù)調(diào)用其 SecurityManager#checkAccess(ThreadGroup) 方法。

此外,當(dāng)覆蓋 getContextClassLoader 或 setContextClassLoader 方法的子類的構(gòu)造函數(shù)直接或間接調(diào)用時,它的 checkPermission 方法使用 RuntimePermission("enableContextClassLoaderOverride") 權(quán)限調(diào)用。

新創(chuàng)建線程的優(yōu)先級設(shè)置為等于創(chuàng)建它的線程的優(yōu)先級,即當(dāng)前運(yùn)行的線程。方法 setPriority 可用于將優(yōu)先級更改為新值。

當(dāng)且僅當(dāng)創(chuàng)建它的線程當(dāng)前被標(biāo)記為守護(hù)線程時,新創(chuàng)建的線程最初被標(biāo)記為守護(hù)線程。方法 setDaemon 可用于更改線程是否為守護(hù)進(jìn)程。

參數(shù):

參數(shù)名稱 參數(shù)描述
group 線程組。 如果為 null 并且存在安全管理器,則該組由 SecurityManager#getThreadGroup 確定。 如果沒有安全管理器或 SecurityManager.getThreadGroup() 返回 null,則將該組設(shè)置為當(dāng)前線程的線程組。
target 此線程啟動時調(diào)用其 run 方法的對象。 如果為 null,則調(diào)用此線程的 run 方法。
name 新線程的名稱

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程無法在指定線程組中創(chuàng)建線程或無法覆蓋上下文類加載器方法。

Thread

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

分配一個新的 Thread 對象,使其以 target 作為其運(yùn)行對象,以指定的名稱作為其名稱,并屬于由 group 引用的線程組,并具有指定的堆棧大小。

此構(gòu)造函數(shù)與 Thread(java.lang.ThreadGroup,java.lang.Runnable,java.lang.String) 相同,只是它允許指定線程堆棧大小。堆棧大小是虛擬機(jī)要為此線程堆棧分配的地址空間的近似字節(jié)數(shù)。 stackSize 參數(shù)的影響(如果有)高度依賴于平臺。

在某些平臺上,為 stackSize 參數(shù)指定更高的值可能允許線程在拋出 StackOverflowError 之前實(shí)現(xiàn)更大的遞歸深度。類似地,指定較低的值可能允許更多線程同時存在,而不會引發(fā) OutOfMemoryError(或其他內(nèi)部錯誤)。 stackSize 參數(shù)的值與最大遞歸深度和并發(fā)級別之間的關(guān)系細(xì)節(jié)取決于平臺。在某些平臺上,stackSize 參數(shù)的值可能沒有任何影響。

虛擬機(jī)可以自由地將 stackSize 參數(shù)視為建議。如果平臺的指定值過低,虛擬機(jī)可能會使用一些特定于平臺的最小值;如果指定的值過高,則虛擬機(jī)可能會改為使用某些特定于平臺的最大值。同樣,虛擬機(jī)可以隨意向上或向下舍入指定的值(或完全忽略它)。

為 stackSize 參數(shù)指定零值將導(dǎo)致此構(gòu)造函數(shù)的行為與 Thread(ThreadGroup, Runnable, String) 構(gòu)造函數(shù)完全相同。

由于此構(gòu)造函數(shù)的行為依賴于平臺,因此在使用時應(yīng)格外小心。執(zhí)行給定計(jì)算所需的線程堆棧大小可能會因 JRE 實(shí)現(xiàn)而異。鑒于這種變化,可能需要仔細(xì)調(diào)整堆棧大小參數(shù),并且可能需要針對運(yùn)行應(yīng)用程序的每個 JRE 實(shí)現(xiàn)重復(fù)調(diào)整。

實(shí)現(xiàn)說明:鼓勵 Java 平臺實(shí)現(xiàn)者記錄其實(shí)現(xiàn)與 stackSize 參數(shù)相關(guān)的行為。

參數(shù):

參數(shù)名稱 參數(shù)描述
group 線程組。 如果為 null 并且存在安全管理器,則該組由 SecurityManager#getThreadGroup 確定。 如果沒有安全管理器或 SecurityManager.getThreadGroup() 返回 null,則將該組設(shè)置為當(dāng)前線程的線程組。
target 此線程啟動時調(diào)用其 run 方法的對象。 如果為 null,則調(diào)用此線程的 run 方法。
name 新線程的名稱
stackSize 新線程所需的堆棧大小,或?yàn)榱惚硎疽雎源藚?shù)。

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程無法在指定線程組中創(chuàng)建線程

方法詳情

currentThread

public static Thread currentThread()

返回對當(dāng)前正在執(zhí)行的線程對象的引用。

返回:

當(dāng)前正在執(zhí)行的線程。

yield

public static void yield()

向調(diào)度程序提示當(dāng)前線程愿意放棄其當(dāng)前對處理器的使用。 調(diào)度程序可以隨意忽略此提示。

Yield 是一種啟發(fā)式嘗試,旨在改善線程之間的相對進(jìn)展,否則會過度使用 CPU。 它的使用應(yīng)與詳細(xì)的分析和基準(zhǔn)測試相結(jié)合,以確保它實(shí)際上具有預(yù)期的效果。

很少使用這種方法。 它對于調(diào)試或測試目的可能很有用,它可能有助于重現(xiàn)由于競爭條件導(dǎo)致的錯誤。 在設(shè)計(jì)并發(fā)控制結(jié)構(gòu)(例如 java.util.concurrent.locks 包中的結(jié)構(gòu))時,它也可能很有用。

sleep

public static void sleep(long millis) throws InterruptedException

使當(dāng)前執(zhí)行的線程休眠(暫時停止執(zhí)行)指定的毫秒數(shù),取決于系統(tǒng)計(jì)時器和調(diào)度程序的精度和準(zhǔn)確性。 該線程不會失去任何監(jiān)視器的所有權(quán)。

參數(shù):

參數(shù)名稱 參數(shù)描述
millis 以毫秒為單位的睡眠時間長度

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果毫秒的值為負(fù)
InterruptedException 如果任何線程中斷了當(dāng)前線程。 拋出此異常時清除當(dāng)前線程的中斷狀態(tài)。

sleep

public static void sleep(long millis, int nanos) throws InterruptedException

使當(dāng)前執(zhí)行的線程休眠(暫時停止執(zhí)行)指定的毫秒數(shù)加上指定的納秒數(shù),具體取決于系統(tǒng)計(jì)時器和調(diào)度程序的精度和準(zhǔn)確性。 該線程不會失去任何監(jiān)視器的所有權(quán)。

參數(shù):

參數(shù)名稱 參數(shù)描述
millis 以毫秒為單位的睡眠時間長度
nanos 0-999999 額外的納秒睡眠

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果 millis 的值為負(fù),或者 nanos 的值不在 0-999999 范圍內(nèi)
InterruptedException 如果任何線程中斷了當(dāng)前線程。 拋出此異常時清除當(dāng)前線程的中斷狀態(tài)。

clone

protected Object clone() throws CloneNotSupportedException

拋出 CloneNotSupportedException,因?yàn)?Thread 不能被有意義地克隆。 而是構(gòu)建一個新線程。

覆蓋:

在類 Object 中克隆

返回:

此實(shí)例的克隆。

Throws:

Throw名稱 Throw描述
CloneNotSupportedException 總是

start

public void start()

使該線程開始執(zhí)行; Java 虛擬機(jī)調(diào)用該線程的 run 方法。

結(jié)果是兩個線程同時運(yùn)行:當(dāng)前線程(從對 start 方法的調(diào)用返回)和另一個線程(執(zhí)行其 run 方法)。

多次啟動一個線程是不合法的。 特別是,線程一旦完成執(zhí)行就可能不會重新啟動。

拋出:

Throw名稱 Throw描述
IllegalThreadStateException 如果線程已經(jīng)啟動。

run

public void run()

如果該線程是使用單獨(dú)的 Runnable 運(yùn)行對象構(gòu)造的,則調(diào)用該 Runnable 對象的 run 方法; 否則,此方法不執(zhí)行任何操作并返回。

Thread 的子類應(yīng)覆蓋此方法。

指定者:

在接口 Runnable 中運(yùn)行

stop

@Deprecated public final void stop()

已棄用。這種方法本質(zhì)上是不安全的。使用 Thread.stop 停止線程會導(dǎo)致它解鎖所有已鎖定的監(jiān)視器(這是未經(jīng)檢查的 ThreadDeath 異常沿堆棧傳播的自然結(jié)果)。如果以前受這些監(jiān)視器保護(hù)的任何對象處于不一致狀態(tài),則損壞的對象將對其他線程可見,從而可能導(dǎo)致任意行為。停止的許多用法應(yīng)該由簡單地修改一些變量以指示目標(biāo)線程應(yīng)該停止運(yùn)行的代碼替換。目標(biāo)線程應(yīng)該定期檢查這個變量,如果變量指示它要停止運(yùn)行,則以有序的方式從它的run方法返回。如果目標(biāo)線程等待很長時間(例如在條件變量上),則應(yīng)使用中斷方法來中斷等待。

強(qiáng)制線程停止執(zhí)行。

如果安裝了安全管理器,則調(diào)用其 checkAccess 方法,并將 this 作為其參數(shù)。這可能會導(dǎo)致引發(fā) SecurityException(在當(dāng)前線程中)。

如果此線程與當(dāng)前線程不同(即當(dāng)前線程試圖停止除自身之外的線程),則另外調(diào)用安全管理器的 checkPermission 方法(帶有 RuntimePermission("stopThread") 參數(shù))。同樣,這可能會導(dǎo)致拋出 SecurityException(在當(dāng)前線程中)。

這個線程所代表的線程被強(qiáng)制停止它正在做的任何異常,并拋出一個新創(chuàng)建的 ThreadDeath 對象作為異常。

允許停止尚未啟動的線程。如果線程最終啟動,它會立即終止。

應(yīng)用程序通常不應(yīng)該嘗試捕獲 ThreadDeath,除非它必須執(zhí)行一些特別的清理操作(請注意,拋出 ThreadDeath 會導(dǎo)致 try 語句的 finally 子句在線程正式終止之前執(zhí)行)。如果一個 catch 子句捕獲了一個 ThreadDeath 對象,那么重新拋出該對象以使線程真正終止是很重要的。

如果未捕獲的異常是 ThreadDeath 的實(shí)例,則對其他未捕獲的異常做出反應(yīng)的頂級錯誤處理程序不會打印出消息或以其他方式通知應(yīng)用程序。

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程不能修改這個線程。

stop

@Deprecated public final void stop(Throwable obj)

已棄用。 此方法最初旨在強(qiáng)制線程停止并將給定的 Throwable 作為異常拋出。 它本質(zhì)上是不安全的(有關(guān)詳細(xì)信息,請參閱 stop()),此外,它還可用于生成目標(biāo)線程未準(zhǔn)備好處理的異常。

引發(fā) UnsupportedOperationException。

參數(shù):

參數(shù)名稱 參數(shù)描述
obj 忽略

interrupt

public void interrupt()

中斷這個線程。

除非當(dāng)前線程正在中斷自己,這總是允許的,否則會調(diào)用該線程的 checkAccess 方法,這可能會導(dǎo)致拋出 SecurityException。

如果此線程在調(diào)用 Object 類的 Object#wait()、Object#wait(long) 或 Object#wait(long, int) 方法或 join()、join(long) 方法時被阻塞, join(long,int)、sleep(long) 或 sleep(long,int) 方法,則其中斷狀態(tài)將被清除并收到 InterruptedException。

如果該線程在 InterruptibleChannel 上的 I/O 操作中被阻塞,則通道將關(guān)閉,線程的中斷狀態(tài)將被設(shè)置,線程將收到 ClosedByInterruptException。

如果該線程在 Selector 中被阻塞,則線程的中斷狀態(tài)將被設(shè)置,并且它將立即從選擇操作返回,可能帶有非零值,就像調(diào)用了選擇器的喚醒方法一樣。

如果前面的條件都不成立,則將設(shè)置該線程的中斷狀態(tài)。

中斷一個不活動的線程不需要有任何效果。

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程不能修改這個線程

interrupted

public static boolean interrupted()

測試當(dāng)前線程是否被中斷。 通過該方法清除線程的中斷狀態(tài)。 換句話說,如果這個方法被連續(xù)調(diào)用兩次,第二次調(diào)用將返回 false(除非當(dāng)前線程再次被中斷,在第一次調(diào)用清除其中斷狀態(tài)之后,第二次調(diào)用檢查它之前)。

由于在中斷時線程不活動而被忽略的線程中斷將通過此方法返回 false 來反映。

返回:

如果當(dāng)前線程已被中斷,則為 true; 否則為false。

isInterrupted

public boolean isInterrupted()

測試此線程是否已被中斷。 線程的中斷狀態(tài)不受此方法的影響。

由于在中斷時線程不活動而被忽略的線程中斷將通過此方法返回 false 來反映。

返回:

如果此線程已被中斷,則為 true; 否則為 false。

destroy

@Deprecated public void destroy()

已棄用。 此方法最初設(shè)計(jì)用于在不進(jìn)行任何清理的情況下銷毀此線程。 它持有的任何監(jiān)視器都將保持鎖定狀態(tài)。 但是,該方法從未實(shí)施。 如果要實(shí)現(xiàn)的話,它會像suspend()那樣容易死鎖。 如果目標(biāo)線程在關(guān)鍵系統(tǒng)資源被銷毀時持有保護(hù)它的鎖,則沒有線程可以再次訪問該資源。 如果另一個線程曾經(jīng)試圖鎖定這個資源,就會導(dǎo)致死鎖。 這種死鎖通常表現(xiàn)為“凍結(jié)”進(jìn)程。

引發(fā) NoSuchMethodError。

Throws:

Throw名稱 Throw描述
NoSuchMethodError 總是

isAlive

public final boolean isAlive()

測試此線程是否存在。 如果線程已啟動且尚未死亡,則該線程處于活動狀態(tài)。

返回:

如果該線程還活著,則為 true; 否則為false。

suspend

@Deprecated public final void suspend()

已棄用。 此方法已被棄用,因?yàn)樗举|(zhì)上容易死鎖。 如果目標(biāo)線程在暫停時對保護(hù)關(guān)鍵系統(tǒng)資源的監(jiān)視器持有鎖,則在目標(biāo)線程恢復(fù)之前沒有線程可以訪問該資源。 如果將恢復(fù)目標(biāo)線程的線程在調(diào)用 resume 之前嘗試鎖定此監(jiān)視器,則會導(dǎo)致死鎖。 這種死鎖通常表現(xiàn)為“凍結(jié)”進(jìn)程。

暫停此線程。

首先,調(diào)用該線程的 checkAccess 方法時不帶任何參數(shù)。 這可能會導(dǎo)致拋出 SecurityException(在當(dāng)前線程中)。

如果線程是活動的,它會被掛起并且不會繼續(xù)前進(jìn),除非它被恢復(fù)。

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程不能修改這個線程。

resume

@Deprecated public final void resume()

已棄用。 此方法僅用于與suspend() 一起使用,該方法已被棄用,因?yàn)樗菀装l(fā)生死鎖。

恢復(fù)掛起的線程。

首先,調(diào)用該線程的 checkAccess 方法時不帶任何參數(shù)。 這可能會導(dǎo)致拋出 SecurityException(在當(dāng)前線程中)。

如果線程處于活動狀態(tài)但被掛起,它會被恢復(fù)并被允許在其執(zhí)行中取得進(jìn)展。

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程不能修改這個線程。

setPriority

public final void setPriority(int newPriority)

更改此線程的優(yōu)先級。

首先調(diào)用該線程的 checkAccess 方法,不帶任何參數(shù)。 這可能會導(dǎo)致拋出 SecurityException。

否則,此線程的優(yōu)先級設(shè)置為指定的 newPriority 和線程的線程組的最大允許優(yōu)先級中的較小者。

參數(shù):

參數(shù)名稱 參數(shù)描述
newPriority 將此線程設(shè)置為的優(yōu)先級

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果優(yōu)先級不在 MIN_PRIORITY 到 MAX_PRIORITY 范圍內(nèi)。
SecurityException 如果當(dāng)前線程不能修改這個線程。

getPriority

public final int getPriority()

返回此線程的優(yōu)先級。

返回:

這個線程的優(yōu)先級。

setName

public final void setName(String name)

將此線程的名稱更改為等于參數(shù)名稱。

首先調(diào)用該線程的 checkAccess 方法,不帶任何參數(shù)。 這可能會導(dǎo)致拋出 SecurityException。

參數(shù):

參數(shù)名稱 參數(shù)描述
name 此線程的新名稱。

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程不能修改這個線程。

getName

public final String getName()

返回此線程的名稱。

返回:

此線程的名稱。

getThreadGroup

public final ThreadGroup getThreadGroup()

返回該線程所屬的線程組。 如果此線程已終止(已停止),則此方法返回 null。

返回:

此線程的線程組。

activeCount

public static int activeCount()

返回當(dāng)前線程的線程組及其子組中活動線程數(shù)的估計(jì)值。 遞歸迭代當(dāng)前線程的線程組中的所有子組。

返回的值只是一個估計(jì)值,因?yàn)樵诖朔椒ū闅v內(nèi)部數(shù)據(jù)結(jié)構(gòu)時線程數(shù)可能會動態(tài)變化,并且可能會受到某些系統(tǒng)線程的存在的影響。 此方法主要用于調(diào)試和監(jiān)視目的。

返回:

當(dāng)前線程的線程組和以當(dāng)前線程的線程組為祖先的任何其他線程組中的活動線程數(shù)的估計(jì)

enumerate

public static int enumerate(Thread[] tarray)

將當(dāng)前線程的線程組及其子組中的每個活動線程復(fù)制到指定的數(shù)組中。 該方法只是調(diào)用當(dāng)前線程的線程組的 [ThreadGroup.enumerate(Thread]) 方法。

應(yīng)用程序可能會使用 activeCount 方法來估計(jì)數(shù)組應(yīng)該有多大,但是如果數(shù)組太短而無法容納所有線程,那么額外的線程將被忽略。 如果獲取當(dāng)前線程的線程組及其子組中的每個活動線程至關(guān)重要,則調(diào)用程序應(yīng)驗(yàn)證返回的 int 值是否嚴(yán)格小于 tarray 的長度。

由于此方法中固有的競爭條件,建議僅將該方法用于調(diào)試和監(jiān)視目的。

參數(shù):

參數(shù)名稱 參數(shù)描述
tarray 將線程列表放入其中的數(shù)組

返回:

放入數(shù)組的線程數(shù)

Throws:

Throw名稱 Throw描述
SecurityException if ThreadGroup.checkAccess() 判斷當(dāng)前線程無法訪問其線程組

countStackFrames

@Deprecated public int countStackFrames()

已棄用。 此調(diào)用的定義取決于已棄用的suspend()。 此外,此調(diào)用的結(jié)果從未明確定義。

計(jì)算此線程中的堆棧幀數(shù)。 線程必須暫停。

返回:

此線程中的堆棧幀數(shù)。

Throws:

Throw名稱 Throw描述
IllegalThreadStateException 如果這個線程沒有被掛起。

join

public final void join(long millis) throws InterruptedException

最多等待幾毫秒讓該線程終止。 超時 0 意味著永遠(yuǎn)等待。

此實(shí)現(xiàn)使用以 this.isAlive 為條件的 this.wait 調(diào)用循環(huán)。 當(dāng)線程終止時,將調(diào)用 this.notifyAll 方法。 建議應(yīng)用程序不要在 Thread 實(shí)例上使用 wait、notify 或 notifyAll。

參數(shù):

參數(shù)名稱 參數(shù)描述
millis 以毫秒為單位的等待時間

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果毫秒的值為負(fù)
InterruptedException 如果任何線程中斷了當(dāng)前線程。 拋出此異常時清除當(dāng)前線程的中斷狀態(tài)。

join

public final void join(long millis, int nanos) throws InterruptedException

最多等待毫秒毫秒加上納秒納秒以使該線程終止。

此實(shí)現(xiàn)使用以 this.isAlive 為條件的 this.wait 調(diào)用循環(huán)。 當(dāng)線程終止時,將調(diào)用 this.notifyAll 方法。 建議應(yīng)用程序不要在 Thread 實(shí)例上使用 wait、notify 或 notifyAll。

參數(shù):

參數(shù)名稱 參數(shù)描述
millis 以毫秒為單位的等待時間
nanos 0-999999 額外的納秒等待

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果 millis 的值為負(fù),或者 nanos 的值不在 0-999999 范圍內(nèi)
InterruptedException 如果任何線程中斷了當(dāng)前線程。 拋出此異常時清除當(dāng)前線程的中斷狀態(tài)。

join

public final void join() throws InterruptedException

等待這個線程死掉。

此方法的調(diào)用與調(diào)用的行為方式完全相同

join(0)

Throws:

Throw名稱 Throw描述
InterruptedException 如果任何線程中斷了當(dāng)前線程。 拋出此異常時清除當(dāng)前線程的中斷狀態(tài)。

dumpStack

public static void dumpStack()

將當(dāng)前線程的堆棧跟蹤打印到標(biāo)準(zhǔn)錯誤流。 此方法僅用于調(diào)試。

setDaemon

public final void setDaemon(boolean on)

將此線程標(biāo)記為守護(hù)線程或用戶線程。 當(dāng)唯一運(yùn)行的線程都是守護(hù)線程時,Java 虛擬機(jī)退出。

此方法必須在線程啟動之前調(diào)用。

參數(shù):

參數(shù)名稱 參數(shù)描述
on 如果為true,則將此線程標(biāo)記為守護(hù)線程

Throws:

Throw名稱 Throw描述
IllegalThreadStateException 如果這個線程還活著
SecurityException if checkAccess() 判斷當(dāng)前線程不能修改這個線程

isDaemon

public final boolean isDaemon()

測試此線程是否為守護(hù)線程。

返回:

如果此線程是守護(hù)線程,則為 true; 否則為假。

checkAccess

public final void checkAccess()

確定當(dāng)前運(yùn)行的線程是否有權(quán)修改該線程。

如果有一個安全管理器,它的 checkAccess 方法會以這個線程作為它的參數(shù)被調(diào)用。 這可能會導(dǎo)致拋出 SecurityException。

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程不允許訪問該線程。

toString

public String toString()

返回此線程的字符串表示形式,包括線程的名稱、優(yōu)先級和線程組。

覆蓋:

類 Object 中的 toString

返回:

此線程的字符串表示形式。

getContextClassLoader

public ClassLoader getContextClassLoader()

返回此線程的上下文 ClassLoader。 上下文 ClassLoader 由線程的創(chuàng)建者提供,供在該線程中運(yùn)行的代碼在加載類和資源時使用。 如果未設(shè)置,則默認(rèn)為父線程的 ClassLoader 上下文。 原始線程的上下文 ClassLoader 通常設(shè)置為用于加載應(yīng)用程序的類加載器。

如果存在安全管理器,并且調(diào)用者的類加載器不為 null 并且與上下文類加載器的祖先不同,則此方法調(diào)用安全管理器的 SecurityManager#checkPermission(java.security.Permission) 方法 RuntimePermission ("getClassLoader") 權(quán)限,用于驗(yàn)證是否允許檢索上下文類加載器。

返回:

此線程的上下文 ClassLoader,或 null 指示系統(tǒng)類加載器(或者,如果失敗,則為引導(dǎo)類加載器)

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程無法獲取上下文 ClassLoader

setContextClassLoader

public void setContextClassLoader(ClassLoader cl)

設(shè)置此線程的上下文 ClassLoader。 上下文類加載器可以在創(chuàng)建線程時設(shè)置,并允許線程的創(chuàng)建者在加載類和資源時通過getContextClassLoader為線程中運(yùn)行的代碼提供合適的類加載器。

如果存在安全管理器,則使用 RuntimePermission ("setContextClassLoader") 權(quán)限調(diào)用其 SecurityManager#checkPermission(java.security.Permission) 方法,以查看是否允許設(shè)置上下文 ClassLoader。

參數(shù):

參數(shù)名稱 參數(shù)描述
cl 此線程的上下文 ClassLoader,或 null 指示系統(tǒng)類加載器(或者,如果失敗,則為引導(dǎo)類加載器)

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程無法設(shè)置上下文 ClassLoader

holdsLock

public static boolean holdsLock(Object obj)

當(dāng)且僅當(dāng)當(dāng)前線程持有指定對象上的監(jiān)視器鎖時才返回 true。

此方法旨在允許程序斷言當(dāng)前線程已經(jīng)持有指定的鎖:

     assert Thread.holdsLock(obj); 

參數(shù):

參數(shù)名稱 參數(shù)描述
obj 測試鎖所有權(quán)的對象

返回:

如果當(dāng)前線程持有指定對象的監(jiān)視器鎖,則為 true。

Throws:

Throw名稱 Throw描述
NullPointerException 如果 obj 為null

getStackTrace

public StackTraceElement[] getStackTrace()

返回表示此線程的堆棧轉(zhuǎn)儲的堆棧跟蹤元素?cái)?shù)組。如果此線程尚未啟動、已啟動但尚未被系統(tǒng)調(diào)度運(yùn)行或已終止,則此方法將返回一個長度為零的數(shù)組。如果返回的數(shù)組長度非零,則數(shù)組的第一個元素表示堆棧的頂部,這是序列中最近的方法調(diào)用。數(shù)組的最后一個元素表示堆棧的底部,它是序列中最近的方法調(diào)用。

如果有一個安全管理器,并且這個線程不是當(dāng)前線程,那么使用一個 RuntimePermission("getStackTrace") 權(quán)限調(diào)用安全管理器的 checkPermission 方法,看看是否可以獲取堆棧跟蹤。

在某些情況下,某些虛擬機(jī)可能會從堆棧跟蹤中省略一個或多個堆棧幀。在極端情況下,允許沒有關(guān)于該線程的堆棧跟蹤信息的虛擬機(jī)從該方法返回一個長度為零的數(shù)組。

返回:

StackTraceElement 數(shù)組,每個代表一個堆棧幀。

Throws:

Throw名稱 Throw描述
SecurityException 如果存在安全管理器并且其 checkPermission 方法不允許獲取線程的堆棧跟蹤。

getAllStackTraces

public static MapThread,StackTraceElement[] getAllStackTraces()

返回所有活動線程的堆棧跟蹤映射。 映射鍵是線程,每個映射值是一個 StackTraceElement 數(shù)組,表示相應(yīng)線程的堆棧轉(zhuǎn)儲。 返回的堆棧跟蹤采用為 getStackTrace 方法指定的格式。

調(diào)用此方法時線程可能正在執(zhí)行。 每個線程的堆棧跟蹤僅代表一個快照,并且每個堆棧跟蹤可能在不同的時間獲得。 如果虛擬機(jī)沒有關(guān)于線程的堆棧跟蹤信息,則將在映射值中返回一個長度為零的數(shù)組。

如果有安全管理器,則使用 RuntimePermission("getStackTrace") 權(quán)限和 RuntimePermission("modifyThreadGroup") 權(quán)限調(diào)用安全管理器的 checkPermission 方法,查看是否可以獲取所有線程的堆棧跟蹤。

返回:

從 Thread 到 StackTraceElement 數(shù)組的 Map,表示相應(yīng)線程的堆棧跟蹤。

Throws:

Throw名稱 Throw描述
SecurityException 如果存在安全管理器并且其 checkPermission 方法不允許獲取線程的堆棧跟蹤。

getId

public long getId()

返回此線程的標(biāo)識符。 線程 ID 是創(chuàng)建此線程時生成的正長整數(shù)。 線程 ID 是唯一的,并且在其生命周期內(nèi)保持不變。 當(dāng)一個線程被終止時,這個線程 ID 可以被重用。

返回:

此線程的 ID。

getState

public Thread.State getState()

返回此線程的狀態(tài)。 此方法設(shè)計(jì)用于監(jiān)控系統(tǒng)狀態(tài),而不是用于同步控制。

返回:

這個線程的狀態(tài)。

setDefaultUncaughtExceptionHandler

public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

設(shè)置當(dāng)線程由于未捕獲的異常而突然終止時調(diào)用的默認(rèn)處理程序,并且沒有為該線程定義其他處理程序。

未捕獲的異常處理首先由線程控制,然后由線程的 ThreadGroup 對象控制,最后由默認(rèn)的未捕獲異常處理程序控制。 如果線程沒有明確的未捕獲異常處理程序集,并且線程的線程組(包括父線程組)沒有專門化其 uncaughtException 方法,則將調(diào)用默認(rèn)處理程序的 uncaughtException 方法。

通過設(shè)置默認(rèn)的未捕獲異常處理程序,應(yīng)用程序可以更改那些已經(jīng)接受系統(tǒng)提供的任何“默認(rèn)”行為的線程處理未捕獲異常的方式(例如記錄到特定設(shè)備或文件)。

請注意,默認(rèn)的未捕獲異常處理程序通常不應(yīng)遵循線程的 ThreadGroup 對象,因?yàn)檫@可能導(dǎo)致無限遞歸。

參數(shù):

參數(shù)名稱 參數(shù)描述
eh 用作默認(rèn)未捕獲異常處理程序的對象。 如果為 null,則沒有默認(rèn)處理程序。

Throws:

Throw名稱 Throw描述
SecurityException 如果存在安全管理器并且它拒絕 RuntimePermission ("setDefaultUncaughtExceptionHandler")

getDefaultUncaughtExceptionHandler

public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()

返回當(dāng)線程由于未捕獲的異常而突然終止時調(diào)用的默認(rèn)處理程序。 如果返回值為 null,則沒有默認(rèn)值。

返回:

所有線程的默認(rèn)未捕獲異常處理程序

getUncaughtExceptionHandler

public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()

返回當(dāng)此線程由于未捕獲的異常而突然終止時調(diào)用的處理程序。 如果該線程沒有顯式設(shè)置未捕獲的異常處理程序,則返回該線程的 ThreadGroup 對象,除非該線程已終止,在這種情況下返回 null。

返回:

此線程的未捕獲異常處理程序

setUncaughtExceptionHandler

public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

設(shè)置當(dāng)此線程由于未捕獲的異常而突然終止時調(diào)用的處理程序。

線程可以通過顯式設(shè)置其未捕獲異常處理程序來完全控制它如何響應(yīng)未捕獲異常。 如果未設(shè)置此類處理程序,則線程的 ThreadGroup 對象充當(dāng)其處理程序。

參數(shù):

參數(shù)名稱 參數(shù)描述
eh 用作此線程的未捕獲異常處理程序的對象。 如果為 null,則此線程沒有顯式處理程序。

Throws:

Throw名稱 Throw描述
SecurityException 如果當(dāng)前線程不允許修改這個線程。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號