线程的生命周期
当一个线程被创建并启动以后,它并不是一直处于运行状态,他会有多个状态,在一个线程的生命周期中,总共有五种状态:新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)。
我们具体说下线程在不同情况下的状态:新建状态:
当我们通过new创建线程实例的时候,这个线程就已经除了新建状态;就绪状态:
当调用线程对象的start()方法以后,线程就从新建状态进入就绪状态,等待系统分配cpu;运行状态:
当线程获取cpu以后,它就从就绪状态进入了运行状态,但线程不可能一直持有cpu,以下情况会将线程从运行状态转至阻塞状态:(1) 线程调用了sleep()方法;
(2)线程调用了一个阻塞的io方法,在等待返回值期间,处于阻塞状态;
(3)线程对象获取一个同步监视器,这个同步监视器正在被其他线程占用;
(4)线程对象等待通知(nofity)
(5)线程对象通过suspend()方法挂起,但这种方法有可能导致死锁,应该避免使用;
阻塞状态:
线程处于阻塞状态时,并不会一直保持,还会重新回到就绪状态:(1) 线程sleep()的时间到了;
(2)线程调用的io方法返回了结果;
(3)线程获取到了同步监视器;
(4)线程在等待通知时,其他线程发出了通知;
(5)线程调用resume()方法恢复;
死亡状态:
线程最终会以三种方式结束,进入死亡状态:(1) 线程执行体run()或call()执行完毕,线程结束;
(2)抛出了未捕获的Exception或者Error;
(3)调用了线程的stop()方法,有可能导致死锁,避免使用
我们用状态转换图来概括下以下线程的生命周期:
*只有处于新建状态的线程才可以通过start()方法进入就绪状态;
处于死亡状态的线程无法再通过start()方法唤醒,会直接抛出状态异常。