Java线程生命周期及常用方法说明

一、Java线程的生命周期——6大状态

Java线程从创建到销毁,一共经历6个状态(不一定每一种状态都经历):

NEW:初始状态,线程被构建,但是还没有调用start方法
RUNNABLED:运行状态,JAVA线程把操作系统中的就绪和运行两种状态统一称为“运行中”
BLOCKED:阻塞状态,表示线程进入等待状态,也就是线程因为某种原因放弃了CPU使用权,阻塞也分为几种情况
WAITING:等待状态
TIME_WAITING:超时等待状态,超时以后自动返回
TERMINATED:终止状态,表示当前线程执行完毕

Java线程从创建到销毁,一共经历6个状态(不一定每一种状态都经历):

Java线程生命周期及常用方法说明

 

 


 

sleep和wait/notify机制, 线程阻塞和等待的区别

sleep()方法

sleep()方法是Thread类的方法,通过其定义可知是个native方法,在指定的时间内(精度取决于CPU)线程进入TIMED_WAITING状态阻塞执行。而且从其注释中可知,并不会失去对任何监视器(monitors)的所有权,也就是说不会释放锁,仅仅会让出cpu的执行权。如下图所示

Java线程生命周期及常用方法说明

调用sleep方法后,线程进入的是TIMED_WAITING状态。Javadoc也说了,调用Thread.sleep方法后,就会进入TIMED_WAITING状态(Linux中是S状态):

Java线程生命周期及常用方法说明

同时,Javadoc也说明,只有在等待监视器锁(Monitor lock)时,才会进入BLOCKED状态(Linux中也是S状态):

 

wait()方法

wait/notify机制

wait()方式是基类Object的方法,其实也是个native方法

不管是wait()还是wait(long timeout, int nanos),其调用的都是wait(long timeout)

The current thread must own this object's monitor

根据注释中的一句话,可以看出此方法调用的前提是当前线程已经获取了对象监视器monitor的所有权。

该方法会调用后不仅会让出cpu的执行权,还会释放锁(即monitor的所有权),并且进入wait set中,知道其他线程调用notify()或者notifyall()方法,或者指定的timeout到了,才会从wait set中出来,并重新竞争锁。
 

区别

最主要的区别就是释放锁(monitor的所有权)与否,但是两个方法都会抛出InterruptedException。

上一篇:flowable 报错 Waiting for changelog lock....


下一篇:日拱一卒 | 线程包括哪些状态?状态之间是如何变化的?