1、通用的线程的生命周期,简称:五态模型:
1:初始状态 指语言层面上的创建线程,操作系统中还没有创建。
2:可运行状态 指线程可以分配CPU执行,这时线程已经在系统中创建成功。
3:运行状态 指当CPU处于空闲时会为其指定一个可运行状态的线程,并且将状态切换到运行状态。
4:休眠状态 指当运行状态的线程调用一个阻塞API或者等待某个事件时,线程状态会转换到休眠状态,同时释放CPU的使用权,休眠状态的线程永远没有机会获得CPU使用权呢,当等待的事件出现时会转换到可运行状态。
5:终止状态 指当线程执行完毕或抛异常时则会进入终止状态,即意味着线程的生命周期结束了。
2、Java中线程的生命周期
Java线程的生命周期分为:NEW(初始化状态)、RUNABLE(可运行状态/运行状态)、BLOCKED(阻塞状态)、WAITING(等待状态)、TIMED_WAITING(有时限的等待)、TERMINATED(终止状态)
BLOCKED(阻塞状态)、WAITING(等待状态)、TIMED_WAITING(有时限的等待)三者在操作系统层面是一种状态,为睡眠状态,Java线程处于这三种状态之一时也代表这个线程永远得不到CPU的使用权。
Java线程状态转换:
初始化 ----> 运行/可运行状态
Java中通过继承Thread或者实现Runable接口创建出来的Thread对象就是初始化状态(NEW),调用线程的start()方法即可将NEW状态转换为RUNABLE状态。
RUNABLE---> WAITING
Java中通过synchronized隐式锁的线程调用awit()方法,或者调用线程的join()方法,调用LockSupport.park()方法
RUNABLE---> TIMED_WAITING
调用转换WAITING状态带超时参数的方法即可
RUNABLE ----> BLOCKED
这种只有一种情况,线程等待synchronized的隐式锁,这种修饰的代码块同一时刻只能有一个线程执行,其他线程只能等待。等待的线程会从RUNABLE转换到BLOCKED状态,当等待的线程获取到锁时会从BLOCKED转换到RUNABLE状态.
RUNABLE --->TERMINATED
线程执行完run方法之后会自动转换到TERMINATED状态,执行run方法时抛出异常也会转换到该状态,终止线程的方法有stop()方法(不建议使用的方法)和interrupt()方法。
本文章参考极客时间中王宝令老师的Java并发编程实战课程,有兴趣的可以购买该课程。