【图解】透彻Java线程状态转换

沙海 2021年6月17日04:50:54Java评论34字数 2226阅读7分25秒阅读模式
摘要

【图解】透彻Java线程状态转换 菜鸟要飞

【图解】透彻Java线程状态转换

菜鸟要飞 文章源自JAVA秀-https://www.javaxiu.com/33250.html

以下文章来源于程序猿阿星,作者点击关注 ?文章源自JAVA秀-https://www.javaxiu.com/33250.html

文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

程序猿阿星文章源自JAVA秀-https://www.javaxiu.com/33250.html

一起成长进阶!专注技术原理、源码,通过图解方式输出技术,这里将会分享操作系统、计算机网络、Java、分布式、数据库等精品原创文章文章源自JAVA秀-https://www.javaxiu.com/33250.html

文章源自JAVA秀-https://www.javaxiu.com/33250.html

文章源自JAVA秀-https://www.javaxiu.com/33250.html

线程状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

先来个开场四连问文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Java线程状态有几个?文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Java线程状态是如何转换?文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Java线程状态转换什么情况会进入锁的等待队列?文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Java线程状态转换什么情况会进入锁的同步队列?文章源自JAVA秀-https://www.javaxiu.com/33250.html

一提到Java线程状态,不少读者立马想到线程状态转换图,但细想,印象又不深刻,只记得有那么几个状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

再要你说出Java线程状态是如何转换的,脑子里可能就如下图一样,已经是一团浆糊了。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

别慌,阿星为了帮读者大大们理清楚上面的问题,会一步一步的把线程状态转换图给画出来,让读者大大们真正的理解Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

首先线程的状态可以分为6态或7态,具体状态如下文章源自JAVA秀-https://www.javaxiu.com/33250.html

6态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • New:新建状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Runnable:可运行状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Terminated:终止状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Waiting:等待状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • TimedWaiting:超时等待状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Blocked:阻塞状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

7态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • New:新建状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Ready:就绪状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Running:运行状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Terminated:终止状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Waiting:等待状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • TimedWaiting:超时等待状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • Blocked:阻塞状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

其实6态与7态差别不大,只不过7态把Runnable可运行状态,拆解成了Ready就绪状态与Running运行状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

阿星以7态为例,来逐步讲解它们之间是如何转换的。文章源自JAVA秀-https://www.javaxiu.com/33250.html

新建状态(New)

我们可以通过实现Runnable接口或继承Thread声明一个线程类,new一个实例后,线程就进入了新建状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

一个刚诞生的线程,处于新建状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

就绪状态(Ready)

线程对象创建成功后,调用该线程的start()函数,线程进入就绪状态,该状态的线程进入可运行线程池中,等待获取C P U的使用权。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

线程表示,我已经准备好了,此时我是就绪状态,快选我吧~文章源自JAVA秀-https://www.javaxiu.com/33250.html

运行状态(Running)

此时线程调度程序正在从可运行线程池中选择一个线程,该线程进入运行状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

换句话说,线程获取到了C P U时间片。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

还没完呢,当线程时间片用完或调用的yield()函数,该线程回到就绪状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

作为一名运气好的线程,我进入了运行状态,但是运气用完了,我还得回到就绪状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

终止状态(Terminated)

线程继续运行,直到执行结束或执行过程中因异常意外终止都会使线程进入终止状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

线程一旦终止,就不能复生,这是不可逆的过程。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

线程的人生迎来了终点,可能一帆风顺过完一生,也可能英年早逝令人惋惜。文章源自JAVA秀-https://www.javaxiu.com/33250.html

等待状态(Waiting)

运行状态的线程执行wait()、join()、LockSupport.park()任意函数,该线程进入等待状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

其中wait()join()函数会让J V M把该线程放入锁等待队列。文章源自JAVA秀-https://www.javaxiu.com/33250.html

处于这种状态的线程不会被分配C P U执行时间,它们要等待被主动唤醒,否则会一直处于等待状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

如果我们要唤醒线程怎么办呢?文章源自JAVA秀-https://www.javaxiu.com/33250.html

执行LockSupport.unpark(t)函数唤醒指定线程,该线程回到就绪状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

而通过notify()、notifyAll()、join线程执行完毕方式,会唤醒锁等待队列的线程,出队的线程回到就绪状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

线程的人生迎来了劫难,听信小人之言,跑去菲律宾做打工,结果被黑工厂扣下,只希望警察叔叔能早日解救我出去。文章源自JAVA秀-https://www.javaxiu.com/33250.html

超时等待状态(Timed waiting)

超时等待与等待状态一样,唯一的区别就是多了超时机制,不会一直等待被其他线程主动唤醒,而是到达指定时间后会自动唤醒文章源自JAVA秀-https://www.javaxiu.com/33250.html

以下函数会触发进入超时等待状态文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • wait(long)文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • join(long)文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • LockSupport.parkNanos(long)文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • LockSupport.parkUtil(long)文章源自JAVA秀-https://www.javaxiu.com/33250.html

  • sleep(long)文章源自JAVA秀-https://www.javaxiu.com/33250.html

其中wait(long)、join(long)函数会让J V M把线程放入锁等待队列。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

后面的唤醒剧情就和等待状态如出一辙,就多了超时时间到了,自动唤醒的动作。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

从菲律宾回国后的线程,也做起了违法的勾当,最终被警察抓捕,好在只判了5年,熬一熬就可以出来了。文章源自JAVA秀-https://www.javaxiu.com/33250.html

阻塞状态(Blocked)

运行状态的线程获取同步锁失败或发出I/O请求,该线程进入阻塞状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

如果是获取同步锁失败J V M还会把该线程放入锁的同步队列。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

同步锁被释放时,锁的同步队列会出队所有线程,进入就绪状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

I/O处理完毕时,该线程重新回到就绪状态。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

出狱后的线程,后面的人生一直都是磕磕碰碰,就没顺利过,大家要引以为戒。文章源自JAVA秀-https://www.javaxiu.com/33250.html

小结

相信读者大大们跟着阿星的思路来,已经掌握了线程状态的知识,以后面试官问这类问题,也可以吊打一番,最后放一张简化的线程转换图为本文画上句号。文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

说个题外话,鸟哥是个比较喜欢折腾的程序员,业余喜欢开发自己网站、小程序、App等,这些东西统统离不开服务器!最近就围绕服务器的主题创建了一个微信群,喜欢玩服务器或者想自己开发一款产品的读者可以进来,相互学习交流!群通知中给大家分享了一套搭建服务器的视频教程哦。非常适合新手学习!我也会时不时的带大家撸点和服务器相关的优惠券!不感兴趣,不喜欢折腾的就没必要凑着闹了!文章源自JAVA秀-https://www.javaxiu.com/33250.html

识别二维码,添加微信后文章源自JAVA秀-https://www.javaxiu.com/33250.html

发送【服务器】即可获取邀请链接文章源自JAVA秀-https://www.javaxiu.com/33250.html

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

这是我部署的机器人,请勿调戏!文章源自JAVA秀-https://www.javaxiu.com/33250.html

推荐阅读文章源自JAVA秀-https://www.javaxiu.com/33250.html

嘘!刚刚发现了一个山寨版某库....文章源自JAVA秀-https://www.javaxiu.com/33250.html

可怕!公司部署了一个东西,悄悄盯着你···文章源自JAVA秀-https://www.javaxiu.com/33250.html

发小被绿,我竭尽所学黑科技,动用云控捉奸寻找证据….文章源自JAVA秀-https://www.javaxiu.com/33250.html

终于把废旧电脑变成了服务器!差点被女票拿去换洗脸盆,真香!

【图解】透彻Java线程状态转换文章源自JAVA秀-https://www.javaxiu.com/33250.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定