W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
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ā)生以下任一情況:
有兩種方法可以創(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ù) | 描述 |
---|---|
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 對象。 |
修飾符和類型 | 方法 | 描述 |
---|---|---|
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 |
public static final int MAX_PRIORITY
線程可以擁有的最大優(yōu)先級。
public static final int MIN_PRIORITY
線程可以擁有的最低優(yōu)先級。
public static final int NORM_PRIORITY
分配給線程的默認(rèn)優(yōu)先級。
public Thread()
分配一個新的 Thread 對象。 此構(gòu)造函數(shù)與 Thread (null, null, gname) 的效果相同,其中 gname 是新生成的名稱。 自動生成的名稱格式為“Thread-”+n,其中 n 是整數(shù)。
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í)行任何操作。 |
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)建線程 |
public Thread(String name)
分配一個新的 Thread 對象。 此構(gòu)造函數(shù)與 Thread (null, null, name) 具有相同的效果。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 新線程的名稱 |
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)建線程 |
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 | 新線程的名稱 |
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)建線程或無法覆蓋上下文類加載器方法。 |
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)建線程 |
public static Thread currentThread()
返回對當(dāng)前正在執(zhí)行的線程對象的引用。
返回:
當(dāng)前正在執(zhí)行的線程。
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))時,它也可能很有用。
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)。 |
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)。 |
protected Object clone() throws CloneNotSupportedException
拋出 CloneNotSupportedException,因?yàn)?Thread 不能被有意義地克隆。 而是構(gòu)建一個新線程。
覆蓋:
在類 Object 中克隆
返回:
此實(shí)例的克隆。
Throws:
Throw名稱 | Throw描述 |
---|---|
CloneNotSupportedException | 總是 |
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)啟動。 |
public void run()
如果該線程是使用單獨(dú)的 Runnable 運(yùn)行對象構(gòu)造的,則調(diào)用該 Runnable 對象的 run 方法; 否則,此方法不執(zhí)行任何操作并返回。
Thread 的子類應(yīng)覆蓋此方法。
指定者:
在接口 Runnable 中運(yùn)行
@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)前線程不能修改這個線程。 |
@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 | 忽略 |
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)前線程不能修改這個線程 |
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。
public boolean isInterrupted()
測試此線程是否已被中斷。 線程的中斷狀態(tài)不受此方法的影響。
由于在中斷時線程不活動而被忽略的線程中斷將通過此方法返回 false 來反映。
返回:
如果此線程已被中斷,則為 true; 否則為 false。
@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 | 總是 |
public final boolean isAlive()
測試此線程是否存在。 如果線程已啟動且尚未死亡,則該線程處于活動狀態(tài)。
返回:
如果該線程還活著,則為 true; 否則為false。
@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)前線程不能修改這個線程。 |
@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)前線程不能修改這個線程。 |
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)前線程不能修改這個線程。 |
public final int getPriority()
返回此線程的優(yōu)先級。
返回:
這個線程的優(yōu)先級。
public final void setName(String name)
將此線程的名稱更改為等于參數(shù)名稱。
首先調(diào)用該線程的 checkAccess 方法,不帶任何參數(shù)。 這可能會導(dǎo)致拋出 SecurityException。
參數(shù):
參數(shù)名稱 | 參數(shù)描述 |
---|---|
name | 此線程的新名稱。 |
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果當(dāng)前線程不能修改這個線程。 |
public final String getName()
返回此線程的名稱。
返回:
此線程的名稱。
public final ThreadGroup getThreadGroup()
返回該線程所屬的線程組。 如果此線程已終止(已停止),則此方法返回 null。
返回:
此線程的線程組。
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ì)
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)前線程無法訪問其線程組 |
@Deprecated public int countStackFrames()
已棄用。 此調(diào)用的定義取決于已棄用的suspend()。 此外,此調(diào)用的結(jié)果從未明確定義。
計(jì)算此線程中的堆棧幀數(shù)。 線程必須暫停。
返回:
此線程中的堆棧幀數(shù)。
Throws:
Throw名稱 | Throw描述 |
---|---|
IllegalThreadStateException | 如果這個線程沒有被掛起。 |
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)。 |
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)。 |
public final void join() throws InterruptedException
等待這個線程死掉。
此方法的調(diào)用與調(diào)用的行為方式完全相同
join(0)
Throws:
Throw名稱 | Throw描述 |
---|---|
InterruptedException | 如果任何線程中斷了當(dāng)前線程。 拋出此異常時清除當(dāng)前線程的中斷狀態(tài)。 |
public static void dumpStack()
將當(dāng)前線程的堆棧跟蹤打印到標(biāo)準(zhǔn)錯誤流。 此方法僅用于調(diào)試。
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)前線程不能修改這個線程 |
public final boolean isDaemon()
測試此線程是否為守護(hù)線程。
返回:
如果此線程是守護(hù)線程,則為 true; 否則為假。
public final void checkAccess()
確定當(dāng)前運(yùn)行的線程是否有權(quán)修改該線程。
如果有一個安全管理器,它的 checkAccess 方法會以這個線程作為它的參數(shù)被調(diào)用。 這可能會導(dǎo)致拋出 SecurityException。
Throws:
Throw名稱 | Throw描述 |
---|---|
SecurityException | 如果當(dāng)前線程不允許訪問該線程。 |
public String toString()
返回此線程的字符串表示形式,包括線程的名稱、優(yōu)先級和線程組。
覆蓋:
類 Object 中的 toString
返回:
此線程的字符串表示形式。
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 |
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 |
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 |
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 方法不允許獲取線程的堆棧跟蹤。 |
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 方法不允許獲取線程的堆棧跟蹤。 |
public long getId()
返回此線程的標(biāo)識符。 線程 ID 是創(chuàng)建此線程時生成的正長整數(shù)。 線程 ID 是唯一的,并且在其生命周期內(nèi)保持不變。 當(dāng)一個線程被終止時,這個線程 ID 可以被重用。
返回:
此線程的 ID。
public Thread.State getState()
返回此線程的狀態(tài)。 此方法設(shè)計(jì)用于監(jiān)控系統(tǒng)狀態(tài),而不是用于同步控制。
返回:
這個線程的狀態(tài)。
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") |
public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
返回當(dāng)線程由于未捕獲的異常而突然終止時調(diào)用的默認(rèn)處理程序。 如果返回值為 null,則沒有默認(rèn)值。
返回:
所有線程的默認(rèn)未捕獲異常處理程序
public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
返回當(dāng)此線程由于未捕獲的異常而突然終止時調(diào)用的處理程序。 如果該線程沒有顯式設(shè)置未捕獲的異常處理程序,則返回該線程的 ThreadGroup 對象,除非該線程已終止,在這種情況下返回 null。
返回:
此線程的未捕獲異常處理程序
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)前線程不允許修改這個線程。 |
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: