线程的多种状态

线程有几种状态?

咱们正常用到的只有2种,运行跟阻塞,其他都是线程池在管理。

线程初始化归我管吗?
就绪状态归我管吗?
线程挂掉归我管吗?

不归你管也得知道,行吧,来扯扯吧

其实有五种状态,从生到死。
不过现在因为都是用线程池了,线程不是那么容易死掉了,也不是那么容易新建了。

新建——出生

咱得知道,线程这货比较占资源,在JVM里,每个线程都有自己的名字,有自己的地盘,懂?这是排面。

JVM会给它分程序计数器(各个线程私有的,互不影响),虚拟机栈(也是线程私有的),连垃圾,也都只是在java堆跟方法区那边收的,都不敢跟线程提意见。

当然,出生这么费空间,不是那么容易就生出来的。在还没生出来之前,就得占个名儿,还无法使用。

这是初始的状态。

这也是为什么要用线程池的原因,出生这么费劲,要是随随便便就死了,怎么行。

就绪

ok,生出来了,但是还没有工作派给它。还在休息状态,随时等待召唤。

等待也是有原因的,要么是没活干,要么就是干活的工具被别人给占用了,只能等咯。

运行

没啥好说的,努力干活Ing。

阻塞

有蛮多种原因导致阻塞的。
有自身调用wait()的,可能是等什么东西吧,抛弃了身上所有的资源(拿到的锁),去等待队列里等待被人唤醒。

也有抢不过别人的,拿不到锁,不甘心呐,被放入到锁池等待。锁的类型很多啊,有的锁会导致阻塞,有的锁只是导致自旋。

其他类型的阻塞,sleep(),休息一会,但是身上的资源还是死死地攥在手里,称之为假寐更合适吧。

还有join(),A线程调用了B线程,在B干活的时候,A就在等待着,等B干完活,A就到就绪状态那边,等待拿到工具干活。

还有一种很任性的情况,把工具一甩,说,大家来抢吧——yield()。跟玩玩大家似的,A把工具扔出来,然后跟所有就绪状态的线程去抢那把工具。

死亡状态

要么是因为线程出错了,导致程序运行不下去了,或者是把所有活干完了,才会结束生命周期。线程死而不复生,虽然以后可能会有叫同样名字的线程,那也不是它了。

程序过程

new Thread()——初始化——
thread.start()——就绪——
排到工具了——运行中——
wait(),拿锁 ——阻塞——
运行玩,throw error ——死亡——

锁池算是比等待队列离工具更近一点的位置。
一个对象对应一个锁池。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rgbhi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值