在Java中,线程的生命周期指的是一个线程从创建到最终消亡的过程。Java中的线程状态是通过Thread.State
枚举来定义的。根据Java API文档,线程可以处于以下几种状态:
-
新建(New):
- 当一个线程对象被创建出来但还没有调用
start()
方法时,线程就处于新建状态。
- 当一个线程对象被创建出来但还没有调用
-
可运行/就绪(Runnable):
- 一旦线程调用了
start()
方法,它就会进入可运行状态。这并不意味着线程立即开始执行,而是表示该线程已经准备好由CPU调度执行。在这个状态下,线程可能正在运行也可能等待CPU时间片。
- 一旦线程调用了
-
阻塞(Blocked):
- 线程尝试获取一个内部的对象锁(synchronized关键字锁定的对象或类),如果该锁已经被其他线程持有,则当前线程将进入阻塞状态,直到获得锁为止。
-
等待(Waiting):
- 线程无限期地等待另一个线程执行特定的动作。例如,当线程调用了
Object.wait()
、Thread.join()
或者LockSupport.park()
等方法时,线程会进入等待状态,除非被其他线程显式唤醒或中断。
- 线程无限期地等待另一个线程执行特定的动作。例如,当线程调用了
-
计时等待(Timed Waiting):
- 类似于等待状态,但是有超时限制。线程会等待一段时间后自动恢复。比如调用了
Thread.sleep(long millis)
、Object.wait(long timeout)
、Thread.join(long millis)
或者LockSupport.parkNanos(long nanos)
和LockSupport.parkUntil(long deadline)
方法。
- 类似于等待状态,但是有超时限制。线程会等待一段时间后自动恢复。比如调用了
-
终止(Terminated):
- 线程完成其任务并退出run()方法,或者由于异常而提前终止,这时线程进入终止状态。一旦线程终止,就不能再重新启动。
状态转变
线程的状态转换是由JVM控制的,并且随着程序的执行,线程可以在这些状态之间进行切换。
例如,一个线程可以从新建状态过渡到可运行状态,然后可能会因为调用sleep()
方法而进入计时等待状态,之后又回到可运行状态继续执行,直到最终到达终止状态。