线程有几种状态?
咱们正常用到的只有2种,运行跟阻塞,其他都是线程池在管理。
线程初始化归我管吗?
就绪状态归我管吗?
线程挂掉归我管吗?
不归你管也得知道,行吧,来扯扯吧
其实有五种状态,从生到死。
不过现在因为都是用线程池了,线程不是那么容易死掉了,也不是那么容易新建了。
新建——出生
咱得知道,线程这货比较占资源,在JVM里,每个线程都有自己的名字,有自己的地盘,懂?这是排面。
JVM会给它分程序计数器(各个线程私有的,互不影响),虚拟机栈(也是线程私有的),连垃圾,也都只是在java堆跟方法区那边收的,都不敢跟线程提意见。
当然,出生这么费空间,不是那么容易就生出来的。在还没生出来之前,就得占个名儿,还无法使用。
这是初始的状态。
这也是为什么要用线程池的原因,出生这么费劲,要是随随便便就死了,怎么行。
就绪
ok,生出来了,但是还没有工作派给它。还在休息状态,随时等待召唤。
等待也是有原因的,要么是没活干,要么就是干活的工具被别人给占用了,只能等咯。
运行
没啥好说的,努力干活Ing。
阻塞
有蛮多种原因导致阻塞的。
有自身调用wait()的,可能是等什么东西吧,抛弃了身上所有的资源(拿到的锁),去等待队列里等待被人唤醒。
也有抢不过别人的,拿不到锁,不甘心呐,被放入到锁池等待。锁的类型很多啊,有的锁会导致阻塞,有的锁只是导致自旋。
其他类型的阻塞,sleep(),休息一会,但是身上的资源还是死死地攥在手里,称之为假寐更合适吧。
还有join(),A线程调用了B线程,在B干活的时候,A就在等待着,等B干完活,A就到就绪状态那边,等待拿到工具干活。
还有一种很任性的情况,把工具一甩,说,大家来抢吧——yield()。跟玩玩大家似的,A把工具扔出来,然后跟所有就绪状态的线程去抢那把工具。
死亡状态
要么是因为线程出错了,导致程序运行不下去了,或者是把所有活干完了,才会结束生命周期。线程死而不复生,虽然以后可能会有叫同样名字的线程,那也不是它了。
程序过程
new Thread()——初始化——
thread.start()——就绪——
排到工具了——运行中——
wait(),拿锁 ——阻塞——
运行玩,throw error ——死亡——
锁池算是比等待队列离工具更近一点的位置。
一个对象对应一个锁池。