Java线程的生命周期是一个从创建到终止的过程,经历了多种状态的转变。在Java中,线程的生命周期可以划分为以下几个主要状态:
- 新建(New):
- 当使用
new Thread()
创建一个新的线程对象但尚未调用start()
方法时,线程处于新建状态。此时线程对象已经存在,但并没有被分配系统资源,也没有开始执行。
- 当使用
- 就绪(Runnable/Ready):
- 当调用了线程对象的
start()
方法后,线程进入到就绪状态。此时,线程已经被创建并且分配了必要的系统资源,但还没有获得CPU的执行权。线程就绪意味着它可以随时开始运行,但具体何时运行取决于操作系统线程调度器的安排。
- 当调用了线程对象的
- 运行(Running):
- 当线程调度器选中了就绪状态的线程并为其分配了CPU时间片时,线程进入运行状态。线程在其
run()
方法中执行任务。
- 当线程调度器选中了就绪状态的线程并为其分配了CPU时间片时,线程进入运行状态。线程在其
- 阻塞(Blocked):
- 当线程在执行过程中遇到某些条件不能继续运行时,如等待获取锁、等待IO操作完成、调用了sleep()、wait()、join()等方法时,线程会进入阻塞状态。在阻塞状态下,线程不会消耗CPU资源,直到满足特定条件后变为就绪状态。
- 等待(Waiting)/超时等待(Timed Waiting):
- 等待状态通常是指线程等待另一个线程执行特定操作(如notify()或notifyAll())才能继续。超时等待状态是指线程在等待一段时间或者等待某个条件的同时设置了超时时间,当达到超时时间或者条件满足时,线程会回到就绪状态。
- 终止(Terminated/Dead):
- 线程完成了它的任务,或者因异常导致run()方法退出,或者调用了Thread类的
stop()
(已废弃)、interrupt()
方法,线程会进入终止状态。终止状态的线程不能再被重新启动,且不再占用系统资源。
- 线程完成了它的任务,或者因异常导致run()方法退出,或者调用了Thread类的
线程6种状态的转换关系,如下图所示:
需要注意的是,Java线程状态的转换并非严格按照上述顺序进行,线程可能会根据实际情况在线程生命周期的不同状态之间来回切换。此外,由于stop()
方法由于可能导致数据不一致和其他问题,已被弃用,推荐使用中断机制来终止线程。