线程的状态及其查看
目录
一. 线程的状态
1. NEW状态
2. TERMINATED状态
3. RUNNABLE状态
4. BLOCKED状态
5. TIMED_WAITING状态
6. WAITING状态
二. 线程状态的查看
1. 通过jconsole查看
2. 通过idea查看
一. 线程的状态
线程共有6种状态:
1. NEW状态
该状态表示线程对象虽然创建了, 但是还没有启动线程.
public class Demo12 {public static void main(String[] args) {Thread t1 = new Thread(() -> {for (int i = 0; i < 3; i++) {System.out.println("t1");}System.out.println("t1线程执行结束");});System.out.println(t1.getState());t1.start();}
}
上述代码在t1线程启动之前就查看t1线程的状态. 所以此时打印出来的结果应该是"NEW".
2. TERMINATED状态
该状态表示线程对象仍然存在, 但是内核中的线程已经销毁了(内核中的线程已经执行完毕).
public class Demo12 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 3; i++) {System.out.println("t1");}System.out.println("t1线程执行结束");});//System.out.println(t1.getState());t1.start();t1.sleep(1000);//睡眠1000ms, 保证线程执行结束System.out.println(t1.getState());}
}
上述代码在t1线程启动之后查看线程状态, 此时虽然线程对象还在, 但是内核中的线程结束. 所以打印出的状态就是"TERMINATED".
3. RUNNABLE状态
该状态表示"就绪状态", 即: 当前线程正在CPU上运行或者可以随时调度到CPU上执行.
public class Demo12 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 3; i++) {System.out.println("t1");}System.out.println("t1线程执行结束");});//System.out.println(t1.getState());t1.start();Thread mainThread = Thread.currentThread();System.out.println(mainThread.getState());//当前主线程正在执行, 打印RUNNABLEt1.sleep(1000);//睡眠1000ms, 保证线程执行结束//System.out.println(t1.getState());}
}
上述代码在main线程运行时获取main线程对象并查看这个线程的状态, 则线程的状态为RUNNABLE.
4. BLOCKED状态
因为锁竞争引起的阻塞. 锁是线程安全问题中的概念, 会在后面的文章中介绍.
5. TIMED_WAITING状态
有超时时间的等待状态. 例如: sleep(), join(millis).
public class Demo13 {public static void main(String[] args) throws InterruptedException {Thread mainThread = Thread.currentThread();Thread t = new Thread(() -> {while (true) {try {System.out.println("main state=" + mainThread.getState());Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});System.out.println(t.getState());t.start();// 由于 t 线程是持续 while 循环, 因此 join 不会返回.// 观察主线程的状态, 就能看到 waiting.t.join(3000);// System.out.println(t.getState());}
}
上述结果查看main线程因为t.join(3000)而等待时的状态. 运行结果如下:
6. WAITING状态
没有超时时间的等待状态. 例如: join(), wait()
public class Demo13 {public static void main(String[] args) throws InterruptedException {Thread mainThread = Thread.currentThread();Thread t = new Thread(() -> {while (true) {try {System.out.println("main state=" + mainThread.getState());Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});System.out.println(t.getState());t.start();// 由于 t 线程是持续 while 循环, 因此 join 不会返回.// 观察主线程的状态, 就能看到 waiting.t.join();// System.out.println(t.getState());}
}
上述结果查看main线程因为t.join()而等待时的状态. 运行结果如下:
二. 线程状态的查看
1. 通过jconsole查看
我们先找到自己安装JDK的目录, 然后找到bin文件夹.
打开bin文件夹, 找到jconsole.exe 并打开.
打开之后, 点击连接本地进程.
点进来之后, 选择线程这一栏, 就能看到我们电脑上本地的进程.
其中, Thread-0 和Thread-1 是我们自己创建的线程.
点开其中一个线程, 就可以查看其各种属性和堆栈跟踪.
[注]: 如果我们忘记了JDK的安装地址, 可以通过 idea -> File -> Project Structure -> SDKs -> JDK home path 查看.
2. 通过idea查看
在idea中, 我们也可以通过Debug调试代码, 在调试框中查看线程信息.