线程的五大状态
结合查询的资料简单归纳一下Java中线程的五种状态。

线程的状态可归结为五种(1)新建状态(初始状态);(2)就绪状态(可运行状态);(3)运行状态;(4)阻塞状态;(5)死亡状态

  文章正文图片
一、新建状态 
线程对象已经创建,但还未调用start()方法。

二、就绪状态
调用了start方法,但是没有立即运行,还在等待调度程序分配CPU时间片段,即还在等待获取CPU使用权,其他运行所需的条件已经具备。在此状态,一旦获取了CPU资源,线程就会立即执行。线程从阻塞状态苏醒和从“锁池”返回后也到达该状态。

三、运行状态
调度程序从就绪线程池中选择一个线程执行。(这也是线程进入运行状态的唯一方式)

四、阻塞状态
阻塞状态又分为三类:
1、等待阻塞:
运行的线程执行wait方法,执行wait方法后,该线程会释放占有的所有资源(包括锁标志),进入等待队列。(注:wait()方法有另外两个重载的版本,一个是wait(long timeout), 另一个wait(long timeout, int nanos)。查看wait()源码可以发现其直接调用的是wait(0)方法。除非调用wait()方法的时候显式地指定了一个大于0的合法timeout参数,否则处于等待状态的线程是无法自动苏醒的, 必须等待其他线程调用了notify()或者notifyall()方法才可能唤醒当前线程【notify方法只是唤醒一个线程,并不能保证唤醒的一定是我们想要的线程】。 另外,wait(0, 0)效果与wait(0)是一致的。
2、同步阻塞:
当运行的线程在获取某个对象的对象锁时,该同步锁被其他线程占用,无法立即获取到,这时候JVM会将当前线程放入锁池中,等待获取所需的锁标记。(该状态也可以看作是一个特殊的等待状态,等待获取同步锁)
3、其他阻塞:
运行的线程执行thread.sleep()或join()方法,又或者正在进行I/O请求时,当前线程就会被置为阻塞状态。直到I/O请求处理完成,或者sleep()结束,或者调用join方法的线程执行完毕,该线程才会进入就绪状态,等待获取CPU资源。

五、死亡状态
线程执行完run方法或者因异常退出run方法,就认为当前线程已经死亡。线程一旦死亡变不能复生。若在一个线程死亡后调用其start()方法,会抛出java.lang.IllegalThreadStateException异常。


此处只是简单说明了一下线程的5种状态,并没有深入剖析,也没有细说相关的方法。后续会补上我对一些方法的理解。请关注标签:多线程。在文章底部点击即可。

当然,以上只是我结合一些参考文档总结的个人看法,若您发现了其中的错误或者疏漏,欢迎给我留言或者邮件song@devsong.org。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门