1.新建
当程序使用new关键字创建了一个线程之后,该线程就属于新建状态,此时它和其他的Java对象一样,仅仅由Jva虚拟机为其分配内存,并初始化其成员变量的值。
2.就绪
当对象调用start()方法之后,该线程就立即就绪状态,(相当于等待执行)Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态的线程并没有开始运行,只是表示该线程可以运行了,至于该线程何时开始运行,取决于JVM里线程调度器的调度。启动线程使用start()方法,而不是run()方法,永远不要直接调用线程对象的run()方法。调用start()方法来启动线程,系统会把该run方法当成线程执行体来处理;如果直接调用run()方法,系统会把他当成一个普通对象,run()方法也是一个普通方法。
3.运行
如果处于就绪状态的线程获得了cpu,开始执行run()方法的线程执行体,则该线程就处于运行状态。如果计算机只有一个CPU,那么在任何时刻只有-一个线程处于运行状态。当然,在-个多处理器的机器上,将会有多个线程并行(注意是并行: parallel) 执行;当线程数大于处理器数时,依然会存在多个线程在同一个CPU上轮换的现象。;
当一个线程开始运行后,它不可能一~直处 于运行状态(除非它的线程执行体足够短,瞬间就执行结束了),线程在运行过程中需要被中断,目的是使其他线程获得执行的机会,线程调度的细节取决于底层平台所采用的策略。对于采用抢占式策略的系统而言,系统会给每个可执行的线程-一个小时间段来处理任务;当该时间段用完后,系统就会剥夺该线程所占用的资源,让其他线程获得执行的机会。在选择下一个线程时,系统会考虑线程的优先级。
4.阻塞
在运行时刻,发生如下情况时,线程将会进入阻塞状态
a.线程调用sleep()方法主动放弃所占用的处理器资源
b.线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞。
c.线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有。
d.线程在等待某个通知(notify).
e.程序调用了线程的suspend()方法将将该线程挂起。
解除阻塞,,,就会重新进入就绪状态,记住不是直接进入运行状态,是进入就绪状态。
5.线程死亡
线程会以如下三种方式结束,结束后就处于死亡状态
run()或call()方法执行完成,线程正常结束
线程抛出一个未捕获的异常或者错误。
直接调用该线程的stop()方法来结束该线程---该方法容易导致死锁,