Thread.Status中定义了线程的状态,也就是我们通过jstack能看到的线程的状态,主要有下面几种:
线程可以处于下列状态之一:
1.NEW 至今尚未启动的线程的状态。
2.RUNNABLE 可运行线程的线程状态。处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器。在这里没有RUNNING状态的,真正在运行的线程状态也都是现实RUNNABLE状态。至于原因,现在不是很明白。
3.BLOCKED 受阻塞并且正在等待监视器锁的某一线程的线程状态。处于受阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或者在调用 Object.wait 之后再次进入同步的块/方法。
4.WAITING 某一等待线程的线程状态。某一线程因为调用下列方法之一而处于等待状态:不带超时值的 Object.wait;不带超时值的 Thread.join;LockSupport.park
5.TIMED_WAITING具有指定等待时间的某一等待线程的线程状态。某一线程因为调用以下带有指定正等待时间的方法之一而处于定时等待状态:Thread.sleep;带有超时值的 Object.wait;带有超时值的 Thread.join;LockSupport.parkNanos;LockSupport.parkUntil
6.TERMINATED
已终止线程的线程状态。线程已经结束执行。
注意:在给定时间点上,一个线程只能处于一种状态。这些状态是虚拟机状态,它们并没有反映所有操作系统线程状态。
下面的代码演示了线程的状态
import java.util.concurrent.locks.LockSupport;
public class App {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable() {
private int count = 0;
public void run() {
long start = System.currentTimeMillis();
long end = 0;
//RUNNABLE
while ((end - start) <= 10000) {
count++;
end = System.currentTimeMillis();
}
System.out.println("-----------------------------after 10 second");
//TIME_WAITING
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//WAITING
LockSupport.park();
}
});
outputStatus(t);
t.start();
outputStatus(t);
Thread.sleep(5000);
outputStatus(t);
Thread.sleep(7000);
outputStatus(t);
Thread.sleep(5000);
t.interrupt();
outputStatus(t);
Thread.sleep(1000);
outputStatus(t);
System.out.println("main over");
}
public static void outputStatus(Thread t) {
System.out.println(t.getState());
}
}
输出:
NEW
RUNNABLE
RUNNABLE
-----------------------------after 10 second
TIMED_WAITING
WAITING
TERMINATED
main over