周期状态:新建,就绪,运行,阻塞,死亡。
a.新建
当使用new关键字创建一个线程时,JVM为其分配内存并初始化成员变量。此时的状态为新建状态,既不会执行线程体也不会,也不会表现出任何动态。
b.就绪
对刚创建好的线程来调用start()方法(此方法只能调用一次),线程进入就绪状态。JVM为其创建方法调用栈和程序计数器,此时该线程可以运行了,但何时运行取决于JVM里线程调度器的调度。
下面代码试例:
c.运行
就绪状态的线程获得了CPU,开始运行run()方法线程执行体,则该线程处于运行状态。
注意:对于一个CPU,任何时刻只会有一个线程在运行,对于多个CPU,线程执行会处于并行(Parallel),不过,当线程数大于CPU个数的时候,还会有线程在同一个CPU上并发执行。
d.阻塞
当然,线程不可能一直处于运行状态(除非线程体非常短,马上就执行完),运行过程中需要被打断,让另一个线程运行。既对抢占式策略的系统来说,系统会给每一个线层一段的运行时间,当过了这段时间,系统会剥夺这个线程所占的资源,让其它线程获得执行的机会(系统选择下一个线程会考虑线程优先级)。
以下状况,线程会进入阻塞状态:
1.线程调用sleep方法主动放弃所占的处理器资源。
(调用sleep方法的线程超过了指定时间重新就如就绪状态)
2.线程调用了一个阻塞式IO方法,在该方法返回结果之前,该线程被阻塞。
(线程中调用的阻塞式IO方法已经返回结果重新就如就绪状态)
3.线程试图获得一个同步监视器,但该监视器正在被其它线程所持有。
(线程成功的获得了同步监视器重新就如就绪状态)
4.线程等待某个通知(notify)。
(线程正在等待某个通知时,其它线程发送了通知重新就如就绪状态)
5.程序调用了suspend方法将该线程挂起(这个方法容易死锁,应当避免使用)。
(处于关起状态的线程调用了resume恢复方法重新就如就绪状态)
e.死亡
线程执行完run()方法线程体、抛出一个未捕获的Exception或error或调用stop()方法结束此线程,线程进入死亡状态。
1.run()方法执行完,线程正常结束。
2.线程抛出了以个未 捕获的Exception或error。
3.直接调用该线程的stop()方法结束线程(调用此方法容易造成死锁,不建议使用)。
一张图大致理解: