JavaTM Platform
Standard Ed. 6

java.lang
类 Thread

java.lang.Object
  继承者 java.lang.Thread
所有已实现的接口:
Runnable

public class Thread
extends Object
implements Runnable

线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。

每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。

当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:

创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。例如,计算大于某一规定值的质数的线程可以写成:


     class PrimeThread extends Thread {
         long minPrime;
         PrimeThread(long minPrime) {
             this.minPrime = minPrime;
         }
 
         public void run() {
             // compute primes larger than minPrime
              . . .
         }
     }
 

然后,下列代码会创建并启动一个线程:

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

创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:


     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();
 

每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。

从以下版本开始:
JDK1.0
另请参见:
Runnable, Runtime.exit(int), run(), stop()

嵌套类摘要
static class Thread.State
          线程状态。
static interface Thread.UncaughtExceptionHandler
          当 Thread 因未捕获的异常而突然终止时,调用处理程序的接口。
 
字段摘要
static int MAX_PRIORITY
          线程可以具有的最高优先级。
static int MIN_PRIORITY
          线程可以具有的最低优先级。
static int NORM_PRIORITY
          分配给线程的默认优先级。
 
构造方法摘要
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 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
          分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小
Thread(ThreadGroup group, String name)
          分配新的 Thread 对象。
 
方法摘要
static int activeCount()
          返回当前线程的线程组中活动线程的数目。
 void checkAccess()
          判定当前运行的线程是否有权修改该线程。
 int countStackFrames()
          已过时。 该调用的定义依赖于 suspend(),但它遭到了反对。此外,该调用的结果从来都不是意义明确的。
static Thread currentThread()
          返回对当前正在执行的线程对象的引用。
 void destroy()
          已过时。 该方法最初用于破坏该线程,但不作任何清除。它所保持的任何监视器都会保持锁定状态。不过,该方法决不会被实现。即使要实现,它也极有可能以 suspend() 方式被死锁。如果目标线程被破坏时保持一个保护关键系统资源的锁,则任何线程在任何时候都无法再次访问该资源。如果另一个线程曾试图锁定该资源,则会出现死锁。这类死锁通常会证明它们自己是“冻结”的进程。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?
static void dumpStack()
          将当前线程的堆栈跟踪打印至标准错误流。
static int enumerate(Thread[] tarray)
          将当前线程的线程组及其子组中的每一个活动线程复制到指定的数组中。
static Map<Thread,StackTraceElement[]> getAllStackTraces()
          返回所有活动线程的堆栈跟踪的一个映射。
 ClassLoader getContextClassLoader()
          返回该线程的上下文 ClassLoader。
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() 一起使用,但 suspend() 已经遭到反对,因为它具有死锁倾向。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?
 void run()
          如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
 void setContextClassLoader(ClassLoader cl)
          设置该线程的上下文 ClassLoader。
 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 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?
 void stop(Throwable obj)
          已过时。 该方法具有固有的不安全性。有关详细信息,请参阅 stop()。 该方法的附加危险是它可用于生成目标线程未准备处理的异常(包括若没有该方法该线程不太可能抛出的已检查的异常)。 有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?
 void suspend()
          已过时。 该方法已经遭到反对,因为它具有固有的死锁倾向。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前任何线程都不能访问该资源。如果重新开始目标线程的线程想在调用 resume 之前锁定该监视器,则会发生死锁。这类死锁通常会证明自己是“冻结”的进程。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?
 String toString()
          返回该线程的字符串表示形式,包括线程名称、优先级和线程组。
static void yield()
          暂停当前正在执行的线程对象,并执行其他线程。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

字段详细信息

MIN_PRIORITY

public static final int MIN_PRIORITY
线程可以具有的最低优先级。

另请参见:
常量字段值

NORM_PRIORITY

public static final int NORM_PRIORITY
分配给线程的默认优先级。

另请参见:
常量字段值

MAX_PRIORITY

public static final int MAX_PRIORITY
线程可以具有的最高优先级。

另请参见:
常量字段值
构造方法详细信息

Thread

public Thread()
分配新的 Thread 对象。这种构造方法与 Thread(null, null, gname) 具有相同的作用,其中 gname 是一个新生成的名称。自动生成的名称的形式为 "Thread-"+n,其中的 n 为整数。

另请参见:
Thread(ThreadGroup, Runnable, String)

Thread

public Thread(Runnable target)
分配新的 Thread 对象。这种构造方法与 Thread(null, target,gname) 具有相同的作用,其中的 gname 是一个新生成的名称。自动生成的名称的形式为 “Thread-”+n,其中的 n 为整数。

参数:
target - 其 run 方法被调用的对象。
另请参见:
Thread(ThreadGroup, Runnable, String)

Thread

public Thread(ThreadGroup group,
              Runnable target)
分配新的 Thread 对象。这种构造方法与 Thread(group, target, gname) 具有相同的作用,其中的 gname 是一个新生成的名称。自动生成的名称的形式为 "Thread-"+n ,其中的 n 为整数。

参数:
group - 线程组。
target - 其 run 方法被调用的对象。
抛出:
SecurityException - 如果当前线程无法在指定的线程组中创建线程。
另请参见:
Thread(ThreadGroup, Runnable, String)

Thread

public Thread(String name)
分配新的 Thread 对象。这种构造方法与 Thread(null, null, name) 具有相同的作用。

参数:
name - 新线程的名称。
另请参见:
Thread(ThreadGroup, Runnable, String)

Thread

public Thread(ThreadGroup group,
              String name)
分配新的 Thread 对象。这种构造方法与 Thread(group, null, name) 具有相同的作用。

参数:
group - 线程组。
name - 新线程的名称。
抛出:
SecurityException - 如果当前线程无法在指定的线程组中创建线程。
另请参见:
Thread(ThreadGroup, Runnable, String)

Thread

public Thread(Runnable target,
              String name)
分配新的 Thread 对象。这种构造方法与 Thread(null, target, name) 具有相同的作用。

参数:
target - 其 run 方法被调用的对象。
name - 新线程的名称。
另请参见:
Thread(ThreadGroup, Runnable, String)

Thread

public Thread(ThreadGroup group,
              Runnable target,
              String name)
分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。

如果 groupnull,并且有安全管理器,则该组由安全管理器的 getThreadGroup 方法确定。如果 groupnull,并且没有安全管理器,或安全管理器的 getThreadGroup 方法返回 null,则该组与创建新线程的线程被设定为相同的 ThreadGroup。

如果有安全管理器,则其 checkAccess 方法通过 ThreadGroup 作为其参数被调用。

此外,当被重写 getContextClassLoadersetContextClassLoader 方法的子类构造方法直接或间接调用时,其 checkPermission 方法通过 RuntimePermission("enableContextClassLoaderOverride") 权限调用。其结果可能是 SecurityException。

如果 target 参数不是 null,则 targetrun 方法在启动该线程时调用。如果 target 参数为 null,则该线程的 run 方法在该线程启动时调用。

新创建线程的优先级被设定为创建该线程的线程的优先级,即当前正在运行的线程的优先级。方法 setPriority 可用于将优先级更改为一个新值。

当且仅当创建新线程的线程当前被标记为守护线程时,新创建的线程才被标记为守护线程。方法 setDaemon 可用于改变线程是否为守护线程。

参数:
group - 线程组。
target - 其 run 方法被调用的对象。
name - 新线程的名称。
抛出:
SecurityException - 如果当前线程无法在指定的线程组中创建线程,或者无法重写上下文类加载器方法。
另请参见:
Runnable.run(), run(), setDaemon(boolean), setPriority(int), ThreadGroup.checkAccess(), SecurityManager.checkAccess(java.lang.Thread)

Thread

public Thread(ThreadGroup group,
              Runnable target,
              String name,
              long stackSize)
分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小

除了允许指定线程堆栈大小以外,这种构造方法与 Thread(ThreadGroup,Runnable,String) 完全一样。堆栈大小是虚拟机要为该线程堆栈分配的地址空间的近似字节数。 stackSize 参数(如果有)的作用具有高度的平台依赖性。

在某些平台上,指定一个较高的 stackSize 参数值可能使线程在抛出 StackOverflowError 之前达到较大的递归深度。同样,指定一个较低的值将允许较多的线程并发地存在,且不会抛出 OutOfMemoryError(或其他内部错误)。stackSize 参数的值与最大递归深度和并发程度之间的关系细节与平台有关。在某些平台上,stackSize 参数的值无论如何不会起任何作用。

作为建议,可以让虚拟机自由处理 stackSize 参数。如果指定值对于平台来说过低,则虚拟机可能使用某些特定于平台的最小值;如果指定值过高,则虚拟机可能使用某些特定于平台的最大值。 同样,虚拟机还会视情况自由地舍入指定值(或完全忽略它)。

stackSize 参数值指定为零将使这种构造方法与 Thread(ThreadGroup, Runnable, String) 构造方法具有完全相同的作用。

由于这种构造方法的行为具有平台依赖性,因此在使用它时要非常小心。执行特定计算所必需的线程堆栈大小可能会因 JRE 实现的不同而不同。鉴于这种不同,仔细调整堆栈大小参数可能是必需的,而且可能要在支持应用程序运行的 JRE 实现上反复调整。

实现注意事项:鼓励 Java 平台实现者文档化其 stackSize parameter 的实现行为。

参数:
group - 线程组。
target - 其 run 方法被调用的对象。
name - 新线程的名称。
stackSize - 新线程的预期堆栈大小,为零时表示忽略该参数。
抛出:
SecurityException - 如果当前线程无法在指定的线程组中创建线程。
从以下版本开始:
1.4
方法详细信息

currentThread

public static Thread currentThread()
返回对当前正在执行的线程对象的引用。

返回:
当前执行的线程。

yield

public static void yield()
暂停当前正在执行的线程对象,并执行其他线程。


sleep

public static void sleep(long millis)
                  throws InterruptedException
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。

参数:
millis - 以毫秒为单位的休眠时间。
抛出:
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。
另请参见:
Object.notify()

sleep

public static void sleep(long millis,
                         int nanos)
                  throws InterruptedException
在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。

参数:
millis - 以毫秒为单位的休眠时间。
nanos - 要休眠的另外 0-999999 纳秒。
抛出:
IllegalArgumentException - 如果 millis 值为负或 nanos 值不在 0-999999 范围内。
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。
另请参见:
Object.notify()

start

public void start()
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。

多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。

抛出:
IllegalThreadStateException - 如果线程已经启动。
另请参见:
run(), stop()

run

public void run()
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

Thread 的子类应该重写该方法。

指定者:
接口 Runnable 中的 run
另请参见:
start(), stop(), Thread(ThreadGroup, Runnable, String)

stop

@Deprecated
public final void stop()
已过时。 该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?

强迫线程停止执行。

如果安装了安全管理器,则以 this 作为其参数调用 checkAccess 方法。这可能引发 SecurityException(在当前线程中)。

如果该线程不同于当前线程(即当前线程试图终止除它本身以外的某一线程),则安全管理器的 checkPermission 方法(带有 RuntimePermission("stopThread") 参数)也会被调用。这会再次抛出 SecurityException(在当前线程中)。

无论该线程在做些什么,它所代表的线程都被迫异常停止,并抛出一个新创建的 ThreadDeath 对象,作为异常。

停止一个尚未启动的线程是允许的。 如果最后启动了该线程,它会立即终止。

应用程序通常不应试图捕获 ThreadDeath,除非它必须执行某些异常的清除操作(注意,抛出 ThreadDeath 将导致 try 语句的 finally 子句在线程正式终止前执行)。如果 catch 子句捕获了一个 ThreadDeath 对象,则重新抛出该对象很重要,因为这样该线程才会真正终止。

对其他未捕获的异常作出反应的顶级错误处理程序不会打印输出消息,或者另外通知应用程序未捕获到的异常是否为 ThreadDeath 的一个实例。

抛出:
SecurityException - 如果当前线程不能修改该线程。
另请参见:
interrupt(), checkAccess(), run(), start(), ThreadDeath, ThreadGroup.uncaughtException(Thread,Throwable), SecurityManager.checkAccess(Thread), SecurityManager.checkPermission(java.security.Permission)

stop

@Deprecated
public final void stop(Throwable obj)
已过时。 该方法具有固有的不安全性。有关详细信息,请参阅 stop()。 该方法的附加危险是它可用于生成目标线程未准备处理的异常(包括若没有该方法该线程不太可能抛出的已检查的异常)。 有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?

强迫线程停止执行。

如果安装了安全管理器,则调用该线程的 checkAccess 方法,这可能引发 SecurityException(在当前线程中)。

如果该线程不同于当前线程(即当前线程试图终止除它本身以外的某一线程),或者 obj 不是 ThreadDeath 的一个实例,则安全管理器的 checkPermission 方法(带有 RuntimePermission("stopThread") 参数)也会被调用。 此外,这可能抛出 SecurityException(在当前线程中)。

如果参数 obj 为 null,则抛出 NullPointerException(在当前线程中)。

无论该线程在做些什么,它所代表的线程都被迫异常停止,并抛出 Throwable 对象 obj,作为一个异常。这是一种不正常的操作,通常情况下,应使用不带任何参数的 stop 方法。

停止一个尚未启动的线程是允许的。 如果最后启动了该线程,它会立即终止。

参数:
obj - 要抛出的可抛出对象。
抛出:
SecurityException - 如果当前线程不能修改该线程。
NullPointerException - 如果 obj 为 null
另请参见:
interrupt(), checkAccess(), run(), start(), stop(), SecurityManager.checkAccess(Thread), SecurityManager.checkPermission(java.security.Permission)

interrupt

public void interrupt()
中断线程。

如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException

如果线程在调用 Object 类的 wait()wait(long)wait(long, int) 方法,或者该类的 join()join(long)join(long, int)sleep(long)sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException

如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException

如果该线程在一个 Selector 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup 方法一样。

如果以前的条件都没有保存,则该线程的中断状态将被设置。

中断一个不处于活动状态的线程不需要任何作用。

抛出:
SecurityException - 如果当前线程无法修改该线程

interrupted

public static boolean interrupted()
测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。

线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。

返回:
如果当前线程已经中断,则返回 true;否则返回 false
另请参见:
isInterrupted()

isInterrupted

public boolean isInterrupted()
测试线程是否已经中断。线程的中断状态 不受该方法的影响。

线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。

返回:
如果该线程已经中断,则返回 true;否则返回 false
另请参见:
interrupted()

destroy

@Deprecated
public void destroy()
已过时。 该方法最初用于破坏该线程,但不作任何清除。它所保持的任何监视器都会保持锁定状态。不过,该方法决不会被实现。即使要实现,它也极有可能以 suspend() 方式被死锁。如果目标线程被破坏时保持一个保护关键系统资源的锁,则任何线程在任何时候都无法再次访问该资源。如果另一个线程曾试图锁定该资源,则会出现死锁。这类死锁通常会证明它们自己是“冻结”的进程。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?

抛出 NoSuchMethodError

抛出:
NoSuchMethodError - 始终

isAlive

public final boolean isAlive()
测试线程是否处于活动状态。如果线程已经启动且尚未终止,则为活动状态。

返回:
如果该线程处于活动状态,则返回 true;否则返回 false

suspend

@Deprecated
public final void suspend()
已过时。 该方法已经遭到反对,因为它具有固有的死锁倾向。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前任何线程都不能访问该资源。如果重新开始目标线程的线程想在调用 resume 之前锁定该监视器,则会发生死锁。这类死锁通常会证明自己是“冻结”的进程。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?

挂起线程。

首先,调用线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException(在当前线程中)。

如果线程处于活动状态则被挂起,且不再有进一步的活动,除非重新开始。

抛出:
SecurityException - 如果当前线程不能修改该线程。
另请参见:
checkAccess()

resume

@Deprecated
public final void resume()
已过时。 该方法只与 suspend() 一起使用,但 suspend() 已经遭到反对,因为它具有死锁倾向。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?

重新开始挂起的进程。

首先,调用线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException(在当前线程中)。

如果线程处于活动状态但被挂起,则它会在执行过程中重新开始并允许继续活动。

抛出:
SecurityException - 如果当前线程不能修改该线程。
另请参见:
checkAccess(), suspend()

setPriority

public final void setPriority(int newPriority)
更改线程的优先级。

首先调用线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException

在其他情况下,线程优先级被设定为指定的 newPriority 和该线程的线程组的最大允许优先级相比较小的一个。

参数:
newPriority - 要为线程设定的优先级
抛出:
IllegalArgumentException - 如果优先级不在 MIN_PRIORITYMAX_PRIORITY 范围内。
SecurityException - 如果当前线程无法修改该线程。
另请参见:
getPriority(), checkAccess(), getThreadGroup(), MAX_PRIORITY, MIN_PRIORITY, ThreadGroup.getMaxPriority()

getPriority

public final int getPriority()
返回线程的优先级。

返回:
该线程的优先级。
另请参见:
setPriority(int)

setName

public final void setName(String name)
改变线程名称,使之与参数 name 相同。

首先调用线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException

参数:
name - 该线程的新名称。
抛出:
SecurityException - 如果当前线程不能修改该线程。
另请参见:
getName(), checkAccess()

getName

public final String getName()
返回该线程的名称。

返回:
该线程的名称。
另请参见:
setName(String)

getThreadGroup

public final ThreadGroup getThreadGroup()
返回该线程所属的线程组。 如果该线程已经终止(停止运行),该方法则返回 null。

返回:
该线程的线程组。

activeCount

public static int activeCount()
返回当前线程的线程组中活动线程的数目。

返回:
当前线程的线程组中活动线程的数目。

enumerate

public static int enumerate(Thread[] tarray)
将当前线程的线程组及其子组中的每一个活动线程复制到指定的数组中。该方法只调用当前线程的线程组的 enumerate 方法,且带有数组参数。

首先,如果有安全管理器,则 enumerate 方法调用安全管理器的 checkAccess 方法,并将线程组作为其参数。这可能导致抛出 SecurityException

参数:
tarray - 要复制到的线程对象数组
返回:
放入该数组的线程数
抛出:
SecurityException - 如果安全管理器存在,并且其 checkAccess 方法不允许该操作。
另请参见:
ThreadGroup.enumerate(Thread[]), SecurityManager.checkAccess(ThreadGroup)

countStackFrames

@Deprecated
public int countStackFrames()
已过时。 该调用的定义依赖于 suspend(),但它遭到了反对。此外,该调用的结果从来都不是意义明确的。

计算该线程中的堆栈帧数。线程必须挂起。

返回:
该线程中的堆栈帧数。
抛出:
IllegalThreadStateException - 如果该线程未挂起。

join

public final void join(long millis)
                throws InterruptedException
等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。

参数:
millis - 以毫秒为单位的等待时间。
抛出:
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。

join

public final void join(long millis,
                       int nanos)
                throws InterruptedException
等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。

参数:
millis - 以毫秒为单位的等待时间。
nanos - 要等待的 0-999999 附加纳秒。
抛出:
IllegalArgumentException - 如果 millis 值为负,则 nanos 的值不在 0-999999 范围内。
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。

join

public final void join()
                throws InterruptedException
等待该线程终止。

抛出:
InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。

dumpStack

public static void dumpStack()
将当前线程的堆栈跟踪打印至标准错误流。该方法仅用于调试。

另请参见:
Throwable.printStackTrace()

setDaemon

public final void setDaemon(boolean on)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。

该方法必须在启动线程前调用。

该方法首先调用该线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException(在当前线程中)。

参数:
on - 如果为 true,则将该线程标记为守护线程。
抛出:
IllegalThreadStateException - 如果该线程处于活动状态。
SecurityException - 如果当前线程无法修改该线程。
另请参见:
isDaemon(), checkAccess()

isDaemon

public final boolean isDaemon()
测试该线程是否为守护线程。

返回:
如果该线程是守护线程,则返回 true;否则返回 false
另请参见:
setDaemon(boolean)

checkAccess

public final void checkAccess()
判定当前运行的线程是否有权修改该线程。

如果有安全管理器,则调用其 checkAccess 方法,并将该线程作为其参数。这可能导致抛出 SecurityException

抛出:
SecurityException - 如果不允许当前线程访问该线程。
另请参见:
SecurityManager.checkAccess(Thread)

toString

public String toString()
返回该线程的字符串表示形式,包括线程名称、优先级和线程组。

覆盖:
Object 中的 toString
返回:
该线程的字符串表示形式。

getContextClassLoader

public ClassLoader getContextClassLoader()
返回该线程的上下文 ClassLoader。上下文 ClassLoader 由线程创建者提供,供运行于该线程中的代码在加载类和资源时使用。如果未设定,则默认为父线程的 ClassLoader 上下文。原始线程的上下文 ClassLoader 通常设定为用于加载应用程序的类加载器。

首先,如果有安全管理器,并且调用者的类加载器不是 null,也不同于其上下文类加载器正在被请求的线程上下文类加载器的祖先,则通过 RuntimePermission("getClassLoader") 权限调用该安全管理器的 checkPermission 方法,查看是否可以获取上下文 ClassLoader。

返回:
该线程的上下文 ClassLoader
从以下版本开始:
1.2
另请参见:
setContextClassLoader(java.lang.ClassLoader), SecurityManager.checkPermission(java.security.Permission), RuntimePermission

setContextClassLoader

public void setContextClassLoader(ClassLoader cl)
设置该线程的上下文 ClassLoader。上下文 ClassLoader 可以在创建线程设置,并允许创建者在加载类和资源时向该线程中运行的代码提供适当的类加载器。

首先,如果有安全管理器,则通过 RuntimePermission("setContextClassLoader") 权限调用其 checkPermission 方法,查看是否可以设置上下文 ClassLoader。

参数:
cl - 该线程的上下文 ClassLoader
抛出:
SecurityException - 如果当前线程无法设置上下文 ClassLoader。
从以下版本开始:
1.2
另请参见:
getContextClassLoader(), SecurityManager.checkPermission(java.security.Permission), RuntimePermission

holdsLock

public static boolean holdsLock(Object obj)
当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true

该方法旨在使程序能够断言当前线程已经保持一个指定的锁:

     assert Thread.holdsLock(obj);
 

参数:
obj - 用于测试锁所属权的对象
返回:
如果当前线程在指定的对象上保持监视器锁,则返回 true
抛出:
NullPointerException - 如果 obj 为 null
从以下版本开始:
1.4

getStackTrace

public StackTraceElement[] getStackTrace()
返回一个表示该线程堆栈转储的堆栈跟踪元素数组。如果该线程尚未启动或已经终止,则该方法将返回一个零长度数组。如果返回的数组不是零长度的,则其第一个元素代表堆栈顶,它是该序列中最新的方法调用。最后一个元素代表堆栈底,是该序列中最旧的方法调用。

如果有安全管理器,并且该线程不是当前线程,则通过 RuntimePermission("getStackTrace") 权限调用安全管理器的 checkPermission 方法,查看是否可以获取堆栈跟踪。

某些虚拟机在某些情况下可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,没有该线程堆栈跟踪信息的虚拟机可以从该方法返回一个零长度数组。

返回:
StackTraceElement 数组,每个数组代表一个堆栈帧。
抛出:
SecurityException - 如果安全管理器存在,并且其 checkPermission 方法不允许获取线程的堆栈跟踪。
从以下版本开始:
1.5
另请参见:
SecurityManager.checkPermission(java.security.Permission), RuntimePermission, Throwable.getStackTrace()

getAllStackTraces

public static Map<Thread,StackTraceElement[]> getAllStackTraces()
返回所有活动线程的堆栈跟踪的一个映射。映射键是线程,而每个映射值都是一个 StackTraceElement 数组,该数组表示相应 Thread 的堆栈转储。 返回的堆栈跟踪的格式都是针对 getStackTrace 方法指定的。

在调用该方法的同时,线程可能也在执行。每个线程的堆栈跟踪仅代表一个快照,并且每个堆栈跟踪都可以在不同时间获得。如果虚拟机没有线程的堆栈跟踪信息,则映射值中将返回一个零长度数组。

如果有安全管理器,则通过 RuntimePermission("getStackTrace") 权限和 RuntimePermission("modifyThreadGroup") 权限调用其 checkPermission 方法,查看是否可以获取所有线程的堆栈跟踪。

返回:
ThreadStackTraceElement 数组的一个 Map,代表相应线程的堆栈跟踪。
抛出:
SecurityException - 如果安全管理器存在,并且其 checkPermission 方法不允许获取线程的堆栈跟踪。
从以下版本开始:
1.5
另请参见:
getStackTrace(), SecurityManager.checkPermission(java.security.Permission), RuntimePermission, Throwable.getStackTrace()

getId

public long getId()
返回该线程的标识符。线程 ID 是一个正的 long 数,在创建该线程时生成。线程 ID 是唯一的,并终生不变。线程终止时,该线程 ID 可以被重新使用。

返回:
该线程的 ID。
从以下版本开始:
1.5

getState

public Thread.State getState()
返回该线程的状态。 该方法用于监视系统状态,不用于同步控制。

返回:
该线程的状态。
从以下版本开始:
1.5

setDefaultUncaughtExceptionHandler

public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。

未捕获到的异常处理首先由线程控制,然后由线程的 ThreadGroup 对象控制,最后由未捕获到的默认异常处理程序控制。如果线程不设置明确的未捕获到的异常处理程序,并且该线程的线程组(包括父线程组)未特别指定其 uncaughtException 方法,则将调用默认处理程序的 uncaughtException 方法。

通过设置未捕获到的默认异常处理程序,应用程序可以为那些已经接受系统提供的任何“默认”行为的线程改变未捕获到的异常处理方式(如记录到某一特定设备或文件)。

请注意,未捕获到的默认异常处理程序通常不应顺从该线程的 ThreadGroup 对象,因为这可能导致无限递归。

参数:
eh - 用作未捕获到的默认异常处理程序的对象。 如果为 null,则没有默认处理程序。
抛出:
SecurityException - 如果安全管理器存在并拒绝 RuntimePermission ("setDefaultUncaughtExceptionHandler")
从以下版本开始:
1.5
另请参见:
setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler), getUncaughtExceptionHandler(), ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable)

getDefaultUncaughtExceptionHandler

public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
返回线程由于未捕获到异常而突然终止时调用的默认处理程序。如果返回值为 null,则没有默认处理程序。

从以下版本开始:
1.5
另请参见:
setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)

getUncaughtExceptionHandler

public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
返回该线程由于未捕获到异常而突然终止时调用的处理程序。如果该线程尚未明确设置未捕获到的异常处理程序,则返回该线程的 ThreadGroup 对象,除非该线程已经终止,在这种情况下,将返回 null

从以下版本开始:
1.5

setUncaughtExceptionHandler

public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
设置该线程由于未捕获到异常而突然终止时调用的处理程序。

通过明确设置未捕获到的异常处理程序,线程可以完全控制它对未捕获到的异常作出响应的方式。 如果没有设置这样的处理程序,则该线程的 ThreadGroup 对象将充当其处理程序。

参数:
eh - 用作该线程未捕获到的异常处理程序的对象。如果为 null,则该线程没有明确的处理程序。
抛出:
SecurityException - 如果当前线程无权修改该线程。
从以下版本开始:
1.5
另请参见:
setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler), ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable)

JavaTM Platform
Standard Ed. 6

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2007 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策