线程的生命周期
线程的生命周期中有5个状态:创建、就绪、运行、阻塞、死亡。其中从就绪到运行,这两个状态的切换存在不确定因素,需要等待cpu的调度,获取cpu的时间片。
1:新建和就绪状态
当程序使用new关键字创建了一个线程之后,该程序处于创建状态。
当线程调用start()方法之后,该线程处于就绪状态。
注意:启动线程的方法是start()并不是run()方法。永远不要让线程对象直接调用run()方法。
2:运行和阻塞
运行和阻塞这两个状态是线程中最“复杂”的状态,不过,运行只能单向的到阻塞,而阻塞并不能直接到运行状态。
从运行到阻塞的情况:
(1)线程调用sleep()方法
(2)线程调用了一个阻塞IO方法,在方法返回前,线程被阻塞。
(3)线程获取一个同步监视器,可是该监视器正在被其他线程使用。
(4)线程等待某个通知(notify)
(5)线程调用了suspend()方法,将该线程挂起。(不建议使用,会造成死锁)
阻塞状态只能重新到达就绪状态:
(1)调用sleep()方法的线程经过了指定时间。
(2)调用的阻塞IO方法已经返回。
(3)线程已经获取到了同步监视器。
(4)线程等到了其它线程的通知。
(5)线程调用resume()方法将挂起的线程恢复。
线程切换图:
3:线程死亡
线程从运行到死亡的方式:
(1)调用线程的stop()方法。(不建议使用,容易造成死锁)
(2)线程抛出一个未捕获的Exception或Error
(3)线程执行体run()或call()方法执行结束。
注意: 线程中有一个很常见的异常:IllegalStateException(非法状态异常)。用通俗的语言表达就是,在线程相应的状态干了不相应的事。
比如说:
同一个线程调用了两次start()方法。线程调用第一次start()方法就已经处于就绪状态了,再次以就绪状态调用start()方法让自身处于就绪状态,请问这是闹哪样?
再比如说:
已经死亡的线程,调用start()方法。都“死亡”了,线程自己就没点“逼数”吗?