线程的状态可以清晰地分为以下几种:
- 新建状态(New):
- 线程刚刚被创建,还没有调用
start()
方法。此时,线程处于初始状态,拥有了自己的内存空间,但尚未开始执行。
- 线程刚刚被创建,还没有调用
- 就绪状态(Runnable):
- 线程已经调用了
start()
方法,等待系统为其分配CPU资源。此时,线程已经具备了运行的条件,但还未真正获得CPU执行权。线程位于“可运行线程池”中,只等待获取CPU的使用权。
- 线程已经调用了
- 运行状态(Running):
- 就绪状态的线程获取了CPU,开始执行程序代码。线程在CPU上运行,执行其
run()
方法中的操作。
- 就绪状态的线程获取了CPU,开始执行程序代码。线程在CPU上运行,执行其
- 阻塞状态(Blocked):
- 线程因为某种原因放弃CPU使用权,暂时停止运行。阻塞状态可以分为几种情况:
- 等待阻塞:线程执行了
wait()
方法,释放了占用的所有资源,并被放入“等待池”中。需要其他线程调用notify()
或notifyAll()
方法才能被唤醒。 - 同步阻塞:线程在获取对象的同步锁时,若该同步锁被其他线程占用,则线程被放入“锁池”中等待。
- 其他阻塞:线程执行了
sleep()
或join()
方法,或者发出了I/O请求时,线程被置为阻塞状态。当sleep()
状态超时、join()
等待线程终止或超时,或者I/O处理完毕时,线程重新转入就绪状态。
- 等待阻塞:线程执行了
- 线程因为某种原因放弃CPU使用权,暂时停止运行。阻塞状态可以分为几种情况:
- 等待状态(Waiting):
- 处于这种状态的线程不会被CPU分配执行时间,它们需要等待被其他线程显式地唤醒,否则会处于无限期的等待状态。
- 超时等待状态(Timed Waiting):
- 与等待状态类似,但线程无需无限期地等待被唤醒。例如,当线程执行带有超时参数的
sleep()
方法时,它会在指定的时间后自动醒来。
- 与等待状态类似,但线程无需无限期地等待被唤醒。例如,当线程执行带有超时参数的
- 终止状态(Terminated):
- 线程执行完毕或因异常退出了
run()
方法,到达终止状态。一旦线程进入终止状态,就不能再复生。
- 线程执行完毕或因异常退出了
以上状态涵盖了线程从创建到消亡的整个过程,不同的状态反映了线程在不同时刻的行为状态。