线程状态如图:一共有5种状态,新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)
新建状态:在程序中一个线程对象被创建出来,例如:Thread t = new Thread()此时线程处于新建状态,线程中的代码还没有被执行;
就绪状态:顾名思义也就是说线程处于准备执行阶段,随时可以被cpu的调度。当调用该线程对象的toStart()方法时,该线程就进入了就绪状态,此时并不会立刻去执行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。
运行状态:当线程获得CPU时间片后,它才进入运行状态,真正开始执行run()方法中的代码。有可能在时间片消耗完时,run()中的代码还没执行结束,此时线程又进入了Runnable状态,线程只能等待下个时间片被cpu调度,所以线程会处于Runnable,Running交替转换的过程;
阻塞状态:当线程在Running状态中,遇到以下情况,会导致线程进入阻塞状态(Blocked)。处于阻塞状态的线程,在阻塞等待结束之后,会进入Runnable状态,等待获得CPU时间片继续运行程序。
(1)等待阻塞-- 通过调用线程的wait()方法,让线程等待某工作的完成。
(2)同步阻塞-- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
(3)其他阻塞-- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()(下篇学习)等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
死亡状态:当线程执行完了或者因异常退出了run()方法时,线程生命周期结束。