Java语言使用Thread类及其子类的对象来表示线程,新建的线程在它的生命周期内通常要经历五个状态。
线程的生命周期与运行状态如下图:
创建状态:
当一个Thread类或其子类的对象被声明并创建,但是还未被执行的这段时间里,处于一种特殊的创建状态中。此时线程对象已经被分配了内存空间和其他资源,并且已经被初始化,但是该线程还没有被调度。
就绪状态:
就绪状态也可以称为可运行状态,处以创建状态的线程被启动后,将进入线程队列排队等待CPU时间片,此时它已经具备了运行条件。一旦轮到它来享用CPU资源时,就可以脱离创建它的主线程开始自己的生命周期。
运行状态:
当就绪状态的线程被调度并获得CPU资源时,就进入了运行状态。该状态表示线程正在运行,该线程已经拥有了对CPU的控制权。每一个Thread类及其子类的对象都有一个run()方法,当线程对象被调度执行时,它将自动调用本对象的run()方法,从该方法的第一条语句开始执行,一直到运行完毕,除非该线程主动让出CPU的控制权或者CPU的控制权被优先级更高的线程抢占。
以下情况线程让出CPU的控制权:
线程运行完毕 |
有比当前线程优先级更高的线程处于就绪状态 |
线程主动睡眠一段时间 |
线程在等待某一资源 |
阻塞状态:
一个正在执行的线程如果在某种特殊情况下,将让出CPU并且暂时中止自己的执行,线程处于不可运行的状态。
以下情况线程进入阻塞状态:
调用sleep()或者yield()方法 |
为等待一个条件变量,线程调用了wait()方法 |
该线程和另一线程join()在一起 |
一个线程如果处于阻塞状态,它是不能进入排队队列的,只有当引起阻塞的原因消除的时候,线程才会转入就绪状态,重新进入排队队列,等待CPU资源。
死亡状态:
处于死亡状态的线程不具有继续运行的能力。
一般导致死亡状态的原因有两个:
1.正常运行的线程完成了它的所有工作。
2.当进程因故障而运行时,该进程中的线程会被强制终止。