当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。尤其是当线程启动以后,它不可能一直"霸占"着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换
1. 新建状态,当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值
2. 就绪状态,当线程对象调用了start()方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行
3. 运行状态,如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态
4. 阻塞状态,当处于运行状态的线程失去所占用资源之后,便进入阻塞状态
5. 在线程的生命周期当中,线程的各种状态的转换过程
新建状态New
创建一个线程对象后,该线程对象就处于新建状态,此时,它不能运行,和其他Java对象一样,仅仅由Java虚拟机为其分配了内存,没有表现出任何线程的动态特征
就绪状态Runnable
当线程对象调用了start()方法后,该线程就进入就绪状态,也称可运行状态,处于就绪状态的线程,位于可运行池中,此时,它只是具备了运行的条件,能否获得CPU的使用权开始执行,还需要等待系统的调度
运行状态Running
如果,处于就绪状态的线程,获得了CPU的使用权,开始执行run()方法中的线程执行体,则该线程处于运行状态
当一个线程启动后,它不可能一直处于运行状态,除非它的线程执行体足够短,瞬间就结束了,当使用完系统分配的时间后,系统就会剥夺该线程占用的CPU资源,让其他线程获得执行的机会
注意,只有处于就绪状态的线程,才可能转换到运行状态
阻塞状态Blocked
一个正在执行的线程,在某些特殊情况下,如果,执行耗时的输入、输出操作时,会放弃CPU的使用权,进入阻塞状态
线程,进入阻塞状态后,就不能进入排队队列,只有,当引起阻塞的原因被取消后,线程才可以转入就绪状态
死亡状态Terminated
线程的run()方法,正常执行完毕或者线程抛出一个未捕获的异常Exception、错误Error,线程就进入死亡状态,一旦,进入死亡状态,线程将不再拥有运行的资源,也不能再转换到其他状态
1. 新建状态,当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值
2. 就绪状态,当线程对象调用了start()方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行
3. 运行状态,如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态
4. 阻塞状态,当处于运行状态的线程失去所占用资源之后,便进入阻塞状态
5. 在线程的生命周期当中,线程的各种状态的转换过程
新建状态New
创建一个线程对象后,该线程对象就处于新建状态,此时,它不能运行,和其他Java对象一样,仅仅由Java虚拟机为其分配了内存,没有表现出任何线程的动态特征
就绪状态Runnable
当线程对象调用了start()方法后,该线程就进入就绪状态,也称可运行状态,处于就绪状态的线程,位于可运行池中,此时,它只是具备了运行的条件,能否获得CPU的使用权开始执行,还需要等待系统的调度
运行状态Running
如果,处于就绪状态的线程,获得了CPU的使用权,开始执行run()方法中的线程执行体,则该线程处于运行状态
当一个线程启动后,它不可能一直处于运行状态,除非它的线程执行体足够短,瞬间就结束了,当使用完系统分配的时间后,系统就会剥夺该线程占用的CPU资源,让其他线程获得执行的机会
注意,只有处于就绪状态的线程,才可能转换到运行状态
阻塞状态Blocked
一个正在执行的线程,在某些特殊情况下,如果,执行耗时的输入、输出操作时,会放弃CPU的使用权,进入阻塞状态
线程,进入阻塞状态后,就不能进入排队队列,只有,当引起阻塞的原因被取消后,线程才可以转入就绪状态
死亡状态Terminated
线程的run()方法,正常执行完毕或者线程抛出一个未捕获的异常Exception、错误Error,线程就进入死亡状态,一旦,进入死亡状态,线程将不再拥有运行的资源,也不能再转换到其他状态