我是一个线程
![](https://i-blog.csdnimg.cn/blog_migrate/37274911341ab051b7a67774091cc3de.png)
1、入选NBA(new)
我是一个线程,名叫小托马斯,从小喜欢打篮球,I have a dream,就是要在NBA大显身手。经过了万年不懈努力,我终于在选秀大会上第二轮第61位,被马赛克队选中了,我很不开心,理由你懂的。进入球队后,我被下放到发展联盟里待命,在这里,我发现了好多和我一样等待被主队召回到同伴。
不一会儿,有个看上去很man的兄弟,called him 兰兰,主动找我唠嗑,问我知道这儿的行规不?我满脸懵逼,刚来知道个锤子。他道:我们就是一块砖,哪里需要哪里搬,等到主队召回我们了,就得赶紧去卖苦力,卖完了就要立马回到这里,不然可能就回不来了,切记不能闹事。
![](https://i-blog.csdnimg.cn/blog_migrate/3615f44b3847fefca2b4363491ce195c.png)
ps:一个线程在被创建后,会处于新建状态,JVM为其分配了内存,初始化了成员变量,但是没有任何线程的动态特征。
2、准备上场(runnable)
没过多久,主队好像有人受伤了,正好缺个替补控球后卫,一个助理教练进来了对我们喊道:“那个谁,小托马斯,跟我走”。来了来了,老哥。出来之后我手里就被塞上了一个小纸条,都是防守对面球员的小抄,我必须完美的完成这些任务才能回来,不然我肯定就被裁掉了。
到了球场,我看到了更多的线程,这些个老油子。很快比赛要开始了,各部门(内存、显卡、网卡、数据库、灯光道具,好像有乱入的。。)都在紧张有序的做着准备工作。比赛开始了,我的队友们配合都十分默契,严格遵守教练CPU的战术体系,球没有在任何人手上停留超过2s,球能十分漂亮的投入对手的数据库篮筐里,但耐不住人有四旬老汉,完全顶不住,我们很快就落后了。我这在场下也是干着急,但是没CPU的允许,我这可不能私自入场。唉,还是加油甩毛巾吧。
![](https://i-blog.csdnimg.cn/blog_migrate/3ac0206677db64ce342da87b235c95a1.jpeg)
ps:当线程调用start()方法后,该线程就处于就绪状态,JVM会为其创建方法调用栈和程序计数器,等待被调度运行。
3、上场杀敌(running)
终于在第一节比赛快结束的时候,CPU大手一挥,小托,你上。我赶紧脱裤子上场,但背后还是听到饮水机其他兄弟小声逼逼:“这家伙是教练亲戚吧,优先级这么高,刚来就能上场”。“不是,你能打控球后卫嘛,咱这就俩,优先级能不高“。我可管不了那么多,赶紧偷瞟了下小抄,第一步,防守对面控球后卫肥儿顿,从右边突破喜欢中投,左边突破喜欢上篮。没事,只要我跑得够快,把你这俩招全给端了。很快,目标完成,肥儿顿在我的防守下已经交代了,变成了一个没有感情的往返跑步怪。第二步,把那该死的球投到数据库筐里,嘿嘿,这不就是我的毕生绝学,唰唰唰,比分很快被我们追了上来。但这其中也少不了我们的王牌球员的发挥,波兰大魔王,各种飞天遁地,盖帽抢板得分。所以说我们线程也是有等级划分的,也有三六九等,他们基本上是先发队员,但也不是一定的,谁也不能保证不生病或者不喝多,指不定那天当了软脚虾,就直接膝盖管理了。
![](https://i-blog.csdnimg.cn/blog_migrate/321aabec65dbcc593ae9dc96d962b3f8.jpeg)
ps:如果处于就绪状态的线程获得了CPU资源,开始执行run()方法的线程执行体,则该线程处于运行状态。同时线程是可以设置优先级的,但线程获取CPU资源的顺序并不一定是以优先级为标准。
4、下场休息(blocked)
后来对面教练一看形式不对,就立马把肥儿顿给换下了。我一看,开心呀,终于能偷偷懒了,能在场上多待一会了,喝喝茶聊聊天。但我们CPU可不这么想,看到对面肥儿顿下场了,大喇嘛就用上了,小托,你下。哎哟真烦,我还想多享受会万众瞩目的时光,准备慢慢的系鞋带,悠悠的走下场。CPU就大喊:“赶紧滚下来,别的线程队友也要上场了,6个人就TM违例了!!!”我就麻溜的滚了下来,和身边其他线程坐在替补席继续唠唠嗑。
![](https://i-blog.csdnimg.cn/blog_migrate/b92f6900cc9996017b51cf8bdbb07529.jpeg)
ps:当处于运行状态的线程失去所占用资源之后,便进入阻塞状态,比如sleep()、wait()、join()、I/O 之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态。这里只能类似的比作我因为抽筋下场休息(sleep),需要队医给我补充好能量(notify)后再次上场,如果受伤了我就要一直sleep了;或者是我得等肥儿顿上场(join),我才能继续上场,wait(time)就相当于中场休息吧;比喻可能有些瑕疵,但将就着看看吧,哈哈。
5、驱逐出场(dead-1)
比赛继续进行,到了第四节,比分一直紧咬,关键时刻,对面教练把肥儿顿给再次替换上场,我也随即被教练给叫上去对位,就在一个进攻回合里,我看他护球有破绽,一个健步,伸出短猿臂,抄他丫的。球掉了,我俩都拼了命去抢那球,最后几乎同时抢到了那球,一人两手抱着球,这下比赛进行不下去了,我俩这是锁住了,谁都不服谁,谁能拿到球谁就能多一次进攻,谁就离胜利越接近一点。这时候裁判就吹哨暂停了比赛,我俩准备跳球争夺锁权,球被裁判抛出后,虽然肥儿顿比我高,但我算准了球飞行轨迹,借着时间差,把球给拨给了队友,肥儿顿很气,下个进攻回合里他暗地里给了我一肘子,裁判看到了也假装没看到,这就是NBA的潜规则,算了我是新人,忍了。最后还有30s,他们落后两分,肥儿顿持球进攻,但是不好意思,我再次抢断了他,带球飞奔到他们半场,他在后面扑哧扑哧到追,眼看追不上了,脑子一热,把我狠狠的撞出了球场,裁判吹停了比赛,看了比赛回放后,判了肥儿顿二级恶意犯规,将他驱逐出场了,这本是肥儿顿的最后一个赛季,因为这事也顺势被球队裁掉了。。。他的篮球生涯结束了。
![](https://i-blog.csdnimg.cn/blog_migrate/5c2a24063b58806615c0dd7b732102c8.jpeg)
ps:这儿是把球比喻成了锁,明星球员相当于算法大的线程,一场比赛里能优先拿到球,剩下的球权才是角色球员的。当两个球员同时拿住球的时候就需要跳球决生死了,所以死锁,是指两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行的现象,若无外力作用,他们都将无法推进下去。而被kill掉的线程属于强制终止导致提前结束。
6、联盟停摆(dead-2)
后来,比赛还是按部就班的进行,82场常规赛,有事就跟着CPU南征北战,没事就回发展联盟和线程兄弟们唠唠嗑喝喝茶。但常规赛结束后如果没有被续约就会被裁掉了,就会离开联盟了,所以我还是勤勤恳恳的在训练比赛,争取被续约,但是随着2019年底一场全球疫情,NBA停摆了,何时重启谁也不知道,我只知道我没球可打了,为了生活只能去送外卖。离开球场的时候,我看着球场的东西越来越少,身边的线程兄弟也都各回各家了,心中还是有些凄凉,我的篮球生涯结束了,虽然短暂但却美好,终也能在NBA的历史长河中画下了浅浅一笔---地表最强158。
![](https://i-blog.csdnimg.cn/blog_migrate/d0c4b20c5caae17bf7465b4037bac9a8.jpeg)
ps:线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源。这里肥儿顿算是被提前强制性终止,停摆退役算是出了异常导致结束,正常退役则是正常执行完毕。
以上故事,如有雷同,纯属巧合
谢谢阅读!欢迎关注、转发、在看!