11.4.1 线程的生命周期

11.4.1 线程的生命周期

线程的状态表示线程正在进行的活动以及在此时间段内所能完成的任务。每个线程要经历创建、可运行、运行、不可运行和死亡五种状态。线程从新生到死亡的状态变化过程称为生命周期。线程的生命周期如图11-3所示。

img465

图11-3 线程的生命周期

1.创建状态(new Thread)

通过继承Thread类或实现Runnable接口,可以定义一个具有线程功能的类,再使用new运算符就可以创建一个线程对象。该线程仅仅是一个空对象,还没有分配可运行的系统资源(主要是没有分配CPU时间)。

当一个线程被创建后,只能在相应的状态进行允许的操作,若操作不当会引起非法状态异常(IllegalThreadStateException)。

2.可运行状态(Runnable)

使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于可运行状态(Runnable)。Runnable表示该线程已进入线程队列排队等待运行,但实际上并未真正运行。

可运行状态的线程来自下列情况之一:

1)一个线程被创建;

2)处于运行状态线程的时间片到(系统给每个运行状态线程规定有时间)等;

3)处于阻塞状态的线程的阻塞条件解除。如,调用sleep()方法延迟的时间到,notify()方法唤醒了wait()方法阻塞的线程。

3.运行状态(Running)

线程调度程序按照一定的线程调度原则,从等待运行的处于可运行状态的线程队列中选择一个,使它获得CPU的使用权。这时,该线程就从可运行状态变为了运行状态。此时,系统真正执行线程的run方法代码,直到调用其他方法而终止、或等待某资源而阻塞或完成任务而死亡。

4.不可运行状态(not Runnable)

因为某种原因系统不能执行线程的状态称为不可运行状态,不可运行状态也称为阻塞状态。此时即便处理器空闲也不能执行该线程。

进入不可运行状态的原因通常有:

1)线程调用了sleep()方法;

2)线程调用了Object类的wait()方法;

3)输入/输出流中发生了线程阻塞。

5.死亡状态(Dead)

死亡状态是线程生命周期中的最后一个阶段。有两种状态使线程处于死亡状态:

一个是自然消亡,即正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过执行stop和destroy方法来终止一个线程。