线程可以处于以下状态之一:
- NEW 尚未启动的线程处于此状态。
- RUNNABLE 在Java虚拟机中执行的线程处于此状态。
- BLOCKED 被阻塞等待监视器锁定的线程处于此状态。
- WAITING 无限期等待另一个线程执行特定操作的线程处于此状态。
- TIMED_WAITING 正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。
- TERMINATED 已退出的线程处于此状态。
线程在给定时间点只能处于一种状态。这些状态是虚拟机状态,不反映任何操作系统线程状态。
since: 1.5
引用自Java 6 Thread States and Life Cycle
New是已创建但尚未启动的线程的线程状态。
在较低的操作系统(OS)级别,JVM的Runnable状态可以被视为具有两个子状态的复合状态。当线程转换到Runnable的JVM状态时,线程首先进入Ready子状态。线程调度决定线程何时可以实际启动,继续或暂停。 Thread.yield()明确建议线程调度程序暂停当前正在执行的线程以允许某些其他线程执行。处于Runnable状态的线程从JVM角度执行,但实际上它可能正在等待来自操作系统的某些资源。
TIMED_WAITING是等待指定等待时间的线程的线程状态。指定等待时间大于0,调用以下方法之一会进入TIMED_WAITING状态:
- Thread.sleep(sleeptime)
- Object.wait(timeout)
- Thread.join(timeout)
- LockSupport.parkNanos(timeout)
- LockSupport.parkUntil(timeout)
WAITING 在没有设置超时的情况下调用以下方法之一,线程处于等待状态:
- Object.wait()
- Thread.join()
- LockSupport.park()
注意,处于等待状态的线程正在等待另一个线程执行特定操作。例如,在对象上调用Object.wait()的线程正在等待另一个线程在该对象上调用Object.notify()或Object.notifyAll()。调用Thread.join()的线程正在等待指定的线程终止。这意味着可以使等待状态成为具有与这些特定条件对应的状态的复合状态。进入同步块或方法或在调用Object.wait()之后重新进入同步块或方法时,需要先获得对象监视器,线程此时处于阻塞状态。synchronized语句或方法代表执行线程获取互斥锁,执行块或方法,然后释放锁。当执行线程拥有锁时,没有其他线程可以获取锁并且被阻塞等待锁。
线程完成run()方法的执行后,它将进入TEMINATED终止状态。