版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/strivenoend/article/details/83785578
前言
利用java的类/接口创建好用户线程后,我们调用线程对象的启动方法,让线程启动
线程的生命周期:新建new 就绪runnable 运行running 阻塞blocked 死亡die
线程会在几种状态之间改变
新建new
线程类通过继承Thread实现Runnable/Callable接口来创建,通过new创建线程类的实例时,该线程处于new新建状态,线程对象在虚拟机内被分配了内存,并初始化了成员变量的值,
就绪runnable
线程对象调用了start()方法,该线程处于就绪runnable状态,java虚拟机会为其创建方法调用栈和程序计数器,
运行running
由jvm里线程调度器调度,处于就绪状态的线程获得了cpu,开始执行run()的方法体
阻塞blocked
但是不可能是一个线程一直在占用虚拟机,还需要提供给其他线程获得处理机的机会,因此线程会进入阻塞状态,给其他线程获得处理机的机会,此线程会在合适的时候重新进入就绪状态,再次等待调度器来调度它
注意:就绪和运行态之间的转换通常不受程序控制,而是由系统调度所决定
(当处于就绪状态的线程获得处理器时,该线程进入运行状态,当处于运行状态的线程失去处理器时,线程进入就绪状态)
死亡died
线程的run()/call()方法体结束,线程死亡
线程抛出一个未捕获的异常/error,线程死亡
线程对象调用stop()方法,线程死亡