本文包含:
- 新建和就绪状态
- 运行和阻塞状态
- 线程死亡
1. 新建和就绪状态
当程序使用new 关键字创建了一个线程之后,该线程就处于新建状态,此时它和其它的Java 对象一样,仅仅由 Java 虚拟机为其分配内存,并初始化其成员变量的值。此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。
当线程对象调用了 start() 方法之后,该线程就处于就绪状态,Java 虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。至于什么时候运行取决于JVM 里线程调度器的调度。
注意:只能对处于新建状态的线程调用 start() 方法,否则将引发 IllegalThreadStateException 异常
2. 运行和阻塞状态
当发生如下情况时,线程会进入阻塞状态。
当前正在执行的线程被阻塞之后,其他线程就可以获得执行的机会。被阻塞的线程会在合适的时候重新进入就绪状态,等待线程调度器再次调度她。
针对上述情况,当发生如下特定的情况时可以解除上面的阻塞,让该线程重写进入就绪状态。
下图为线程状态转换图
线程从阻塞状态只能进入就绪状态,不能直接进入运行状态。
而就绪和处理状态之间的转换通常不受程序控制,而是由系统线程调度所决定,当处于就绪状态的线程获得了处理器资源时,该线程进入运行状态,当处于运行状态的线程失去了处理器资源时,该线程进入就绪状态。有一个方法例外:调用yield() 方法可以让运行状态的线程转入就绪状态
3. 线程死亡
线程会以如下三种方式结束,结束后就处于死亡状态。
注意:
对已经死亡的程序再次调用start() 方法来启动该线程。将引发 IllegalThreadStateException异常,这表明处于死亡状态的线程无法再次运行了。
程序只能对新建状态的线程调用 start() 方法,对新建状态的线程两次调用 start() 方法也是错误的。也会引起 IllegalThreadStateException异常。