线程的生命周期为:新建,就绪,运行,阻塞,死亡。
新建与就绪状态
当程序使用关键字 new 创建了一个线程之后,该线程就处于新建状态;当线程对象调用 start() 方法后,该线程就处于就绪状态。至于该线程何时运行,就取决于 JVM 里线程调度器的调度。
只能对新建状态的线程调用 start() 方法,不能对死亡状态的线程再次调用 start() 方法,也不能对已经调用 start() 方法的线程再次调用 start() 方法,否则将引发 IllegalThreadStateException。
运行于阻塞状态
如果处于就绪状态的线程获得了 CPU,开始执行 run() 方法的线程执行体,则该线程处于运行状态。
当运行中的线程发生以下几种情况会使线程处于阻塞状态:
(1) 线程调用 sleep() 方法主动放弃所占用的处理器资源。
(2) 线程调用阻塞式 IO 方法,该方法返回之前,线程处于阻塞状态。
(3) 线程试图获得一个同步监视器,但该同步监视器被其他线程所持有。
(4) 线程在等待某个通知(notify)。
(5) 程序调用线程的 suspend() 方法将该线程挂起。
处于阻塞状态的线程也可以解除阻塞状态:
(1) 调用的 sleep() 方法经过了指定时间。
(2) 线程调用的阻塞式 IO 已经返回。
(3) 线程成功获得了同步监视器。
(4) 线程在等待的通知已经收到。
(5) 处于挂起状态的线程被调用了 resume() 方法。
注意:处于阻塞状态的线程,被解除阻塞后,会重新进入就绪状态,而不是运行状态。
线程死亡
线程会以以下三种方式结束:
(1) run() 方法或 call() 方法执行完成,线程正常结束。
(2) 线程抛出一个未捕获的 Exception 或 Error。
(3) 直接调用该线程的 stop() 方法来结束线程。
为了测试某个线程是否死亡,可以调用线程对象的 isAlive() 方法,当线程处于就绪,运行,阻塞状态时,返回 true,处于新建和死亡状态时,返回 false。
网友评论