线程的生命周期
线程的生命周期🍎
1.五个主要阶段🍏
①NEW
②RUNNABLE
③RUNNING
④BLOCKED
⑤TERMINATED
2.线程的NEW状态🍊
它只是Thread对象的状态,没有start之前,该线程根本不存在,与你用关键字new创建一个普通的Java对象没什么区别。
NEW状态通过start方法进入RUNNABLE状态。
3.线程的RUNNABLE状态🍋
①线程对象调用start方法进入RUNNABLE状态,此时才是真正地在JVM进程中创建了一个线程。
②线程的运行与否和进程一样都要听令于CPU的调度,所以把这个中间状态称为可执行状态(RUNNABLE),但并没有真正地执行起来而是在等待CPU的调度。
4.线程的RUNNING状态🍒
1.CPU通过轮询或者其它方式从任务可执行队列中选中了线程,那么此时才能真正地执行自己的逻辑代码,(注意:一个正在RUNNING状态的线程事实上也是RUNNABLE的,但反过来则不成立)。
2.状态转换:
①直接进入TERMINATED状态,比如调用stop方法或者判断某个逻辑标识(JDK已经不推荐)
②进入BLOCKED状态,比如调用了sleep()、或者wait()而进入了waitSet中
③进行某个阻塞的IO操作,如网络数据的读写而进入了BLOCKED状态
④获取某个锁资源,从而加入到该锁的阻塞队列中而进入了BLOCKED状态
⑤CPU的调度轮询使该线程放弃执行,进入RUNNABLE状态
⑥线程主动调用yeild方法,放弃CPU执行权,进入RUNNABLE状态
5.BLOCKED(阻塞)状态进入RUNNABLE状态🍇
①阻塞操作结束,比如读到了想要的数据字节
②线程完成了指定时间的休眠
③Wait线程被其他线程notify/notifyall唤醒
④获取到了某个锁的资源⑤线程在阻塞过程中被打断,比如其它线程调用了interrupt方法
进入TERMINATED状态:
①比如调用stop方法或者判断某个逻辑标识(JDK已经不推荐)
6.线程的TERMINATED状态🍉
①线程运行正常结束,结束生命周期
②线程运行出错意外结束
③JVM Crash,导致所有的线程都结束