线程的状态和生命周期
您目前处于:技术核心竞争力  2015-01-22

线程共有6种状态;在某一时刻只能是这6种状态之一。这些状态由 Thread.State 这个枚举类型表示,并且可以通过 getState() 方法获得当前具体的状态类型。

NEW

Thread myThread=new MyThread("myThread");

MyThread 实例化之后但还没有执行 start(),这时线程的状态是 NEW。

RUNNABLE

可运行的线程状态。

Thread myThread=new MyThread("myThread");
myThread.start();

当方法被调用 start() 之后,线程就处于 RUNNABLE 状态。但它不一定正在运行,是否运行是由 JAVA 的运行系统来协调决定的。

BLOCKED

受阻塞并且正在等待监视器锁的某一线程的线程状态。

下列情况会进入阻塞状态:

1. 等待某个操作的返回,例如 IO 操作,该操作返回之前,线程不会继续下面的代码。
2. 等待某个"锁",在其他线程或程序释放这个"锁"之前,线程不会继续执行。
3. 等待一定的触发条件。
4. 线程执行了 sleep 方法。
5. 线程被 suspend() 方法挂起。

一个被阻塞的线程在下列情况下会被重新激活:

1. 执行了 sleep() 方法,睡眠时间已到。
2. 等待的其他线程或程序持有的"锁"已被释放。
3. 正在等待触发条件的线程,条件得到满足。
4. 执行了 suspend() 方法,被调用了 resume() 方法。(注:这两个方法已经不推荐使用)
5. 等待的操作返回的线程,操作正确返回。

WAITING

某一等待线程的线程状态。

线程因为调用了 Object.wait() 或 Thread.join() 而未运行,就会进入 WAITING 状态。

TIMED_WAITING

具有指定等待时间的某一等待线程的线程状态。

线程因为调用了 Thread.sleep(),或者加上超时值来调用 Object.wait() 或 Thread.join() 而未运行,则会进入 TIMED_WAITING 状态。

TERMINATED

已终止线程的线程状态。

自然终止:正常运行 run() 方法后终止。

异常终止:调用 stop() 方法后终止。

为了简便我们可以把 BLOCKED、WAITING、TIMED_WAITING、TERMINATED 归为一个状态:BLOCKED

那各个状态之间的相互转换如下图所示:


转载请并标注: “本文转载自 linkedkeeper.com ”  ©著作权归作者所有