线程共有6种状态;在某一时刻只能是这6种状态之一。这些状态由 Thread.State 这个枚举类型表示,并且可以通过 getState() 方法获得当前具体的状态类型。
NEW
1
| Thread myThread=new MyThread("myThread"); |
RUNNABLE
可运行的线程状态。
1
2
| Thread myThread=new MyThread("myThread");myThread.start(); |
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 (文/张松然)”