一、Java线程的生命周期——6大状态
Java线程从创建到销毁,一共经历6个状态(不一定每一种状态都经历):
NEW:初始状态,线程被构建,但是还没有调用start方法
RUNNABLED:运行状态,JAVA线程把操作系统中的就绪和运行两种状态统一称为“运行中”
BLOCKED:阻塞状态,表示线程进入等待状态,也就是线程因为某种原因放弃了CPU使用权,阻塞也分为几种情况
WAITING:等待状态
TIME_WAITING:超时等待状态,超时以后自动返回
TERMINATED:终止状态,表示当前线程执行完毕
Java线程从创建到销毁,一共经历6个状态(不一定每一种状态都经历):
sleep和wait/notify机制, 线程阻塞和等待的区别
sleep()方法
sleep()方法是Thread类的方法,通过其定义可知是个native方法,在指定的时间内(精度取决于CPU)线程进入TIMED_WAITING状态阻塞执行。而且从其注释中可知,并不会失去对任何监视器(monitors)的所有权,也就是说不会释放锁,仅仅会让出cpu的执行权。如下图所示
调用sleep方法后,线程进入的是TIMED_WAITING状态。Javadoc也说了,调用Thread.sleep方法后,就会进入TIMED_WAITING状态(Linux中是S状态):
同时,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。