前言
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。尤其是当线程启动以后,它不可能一直"霸占"着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。
线程状态转换关系
1 新建(New)状态
当程序使用new关键字创建了一个线程之后,该线程就处于 新建状态,此时的线程情况如下:
2 就绪(Runnable)状态
当线程对象调用了start()方法之后,该线程处于 就绪状态。此时的线程情况如下:
调用start()方法与run()方法,对比如下:
如何让子线程调用start()方法之后立即执行而非"等待执行":
3 运行(Running)状态
当CPU开始调度处于 就绪状态 的线程时,此时线程获得了CPU时间片才得以真正开始执行run()方法的线程执行体,则该线程处于 运行状态。
处于运行状态的线程最为复杂,它不可能一直处于运行状态(除非它的线程执行体足够短,瞬间就执行结束了),线程在运行过程中需要被中断,目的是使其他线程获得执行的机会,线程调度的细节取决于底层平台所采用的策略。线程状态可能会变为阻塞状态、就绪状态和死亡状态。比如:
4 阻塞(Blocked)状态
处于运行状态的线程在某些情况下,让出CPU并暂时停止自己的运行,进入 阻塞状态。
当发生如下情况时,线程将会进入阻塞状态:
阻塞状态分类:
在阻塞状态的线程只能进入就绪状态,无法直接进入运行状态。而就绪和运行状态之间的转换通常不受程序控制,而是由系统线程调度所决定。当处于就绪状态的线程获得处理器资源时,该线程进入运行状态;当处于运行状态的线程失去处理器资源时,该线程进入就绪状态。