线程的生命周期一共有6中,如下:
- NEW :初始状态,线程被构建,但是还没有调用 start 方法
创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动), 也就是说新生状态的线程有自己的内存空间,但该线程并没有运行,此时线程还不是活着的(not alive) 。例如:
Thread t1= new Thread();
-
RUNNABLE: 运行状态,JAVA 线程把操作系统中的就绪和运行两种状态统一称为“运行中”,线程已经被启动,正在等待分配CPU时间片。也就通过调用线程实例的start()来启动线程使线程进入就绪状态(runnable)。处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,不一定会被立即执行,此时处于线程就绪队列,等到系统为其分配CPU,等待状态并不是执行状态。此时线程使活着的。
-
RUNNING: 线程获得CPU资源正在执行任务(run方法),此时非此线程自动放弃CPU资源或者有更高优先级的线程进入,线程将一直运行到结束。此时线程使活着的。
-
BLOCKED: 阻塞状态,表示线程进入等待状态,也就是线程因为某种原因放弃了 CPU 使用权,阻塞也分为几种情况
- 等待阻塞: 比如线程执行了wait方法,JVM就会把此线程放入到了等待的队列。
- 同步阻塞: 运行的线程在获取对象的时候被加了锁,若该同步锁被其他线程获取到,那么JVM就会把当前的线程放入到锁的池中。
- 其他阻塞: 比如 Thread.sleep() 或者 join()方法,JVM会把当前线程设置为阻塞状态,当sleep结束,join线程终止则线程恢复。
- TIME_WAITING: 超时等待状态,超时以后自动返回
- TERMINATED:终止状态,表示当前线程执行完毕