线程的生命周期
五种基本状态
当线程被创建并启动以后,它既不是⼀启动就进⼊了执⾏状态,也不是⼀直处于执⾏状态。
新建状态(New)
当线程对象对创建后,即进⼊了新建状态,如: Thread t = new MyThread();
就绪状态(Runnable)
当调⽤线程对象的start()⽅法( t.start(); ),线程即进⼊就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执⾏,并不是说执⾏了 t.start() 此线程⽴即就会执⾏;
运⾏状态(Running)
当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执⾏,即进⼊到运⾏状态。注:就绪状态是进⼊到运⾏状态的唯⼀⼊⼝,也就是说,线程要想进⼊运⾏状态执⾏,⾸先必须处于就绪状态中;
阻塞状态(Blocked)
处于运⾏状态中的线程由于某种原因,暂时放弃对CPU的使⽤权,停⽌执⾏,此时进⼊阻塞状态,直到其进⼊到就绪状态,才有机会再次被CPU调⽤以进⼊到运⾏状态。根据阻塞产⽣的原因不同,阻塞状态⼜可以分为三种:
1.等待阻塞:运⾏状态中的线程执⾏wait()⽅法,使本线程进⼊到等待阻塞状态;多线程状态之间的转换
2.同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占⽤),它会进⼊同步阻塞状态;
3.其他阻塞:通过调⽤线程的sleep()或join()或发出了I/O请求时,线程会进⼊到阻塞状态。当sleep()状态超时、join()等待线程终⽌或者超时、或者I/O处理完毕时,线程重新转⼊就绪状态。
死亡状态(Dead)
线程执⾏完了或者因异常退出了run()⽅法,该线程结束⽣命周期。