线程的生命周期分为:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Dead)五个阶段。
线程启动后,随着CPU的调度,线程会在运行和阻塞两种状态间切换。
新建:使用new关键字创建一个线程后,线程就处于新建状态;
就绪:线程对象调用start方法后,线程处于就绪状态。此时线程能否运行取决于jvm线程调度器的调度;
运行:线程获得CPU后,进入运行状态;
阻塞:未死亡的线程失去CPU后进入阻塞状态;
死亡:线程run()方法执行完成;线程抛出未被捕获的Exception或Error;线程主动调用stop()方法结束当前线程。
线程从运行进入阻塞的情况:
- 线程调用sleep()方法,主动放弃所占用的处理器资源;
- 线程调用了一个阻塞式IO方法,在该方法返回之前,线程被阻塞;
- 线程试图获取一个同步监视器,但该同步监视器正被其他线程所持有;
- 线程在等待某个通知(notify);
- 程序调用了线程的suspend方法将线程挂起
线程从阻塞进入就绪状态:
- 调用sleep()方法的线程已经过了指定的时间;
- 线程调用的阻塞式IO方法已经返回;
- 线程成功获取了同步监视器;
- 线程接收到了通知;
- 处于挂起状态的线程被调用了resume()方法
线程状态转换图:
关于线程死亡:
- 主线程运行结束后,其他线程并不会随之结束。一旦子线程启动后就会拥有和主线程相同的地位。
- 可以使用isAlive()判断线程是否死亡,处于就绪、运行、阻塞状态下的线程isAlive()返回true,处于新建、死亡状态下的线程isAlive()返回false。
- 对已死亡的线程不可以使用start()使之重新启动。只能对新建的线程调用start()方法,但也只能调用一次。