线程状态
Java中的线程状态说的是Thread对象的状态,有自己的生命周期,并不是PCB的状态。
1.
NEW
:创建一个Java线程(对象),但还没调用start()
方法,也就是还没参与CPU调度,此时就是一个Java对象;
2.RUNNABLE
:运行或在就绪队列中(PCB的就绪队列);
3.TERMINATED
:线程执行完成,PCB在操作系统中已经销毁,但是Java对象还在;
4.TIMED_WATING
:等待一段时间(有时间限制的等待,过时不候);
4.WATING
:没有时间限制的等待,死等;
5.BLOCK
:等待锁的时候进入的阻塞状态。
public class Demo09_State {
public static void main(String[] args) throws InterruptedException {
// 创建线程
Thread t1 = new Thread(() -> {
// 第二种情况
// for (int i = 0; i < 1000_0000_00; i++) {
// 啥也不干,等着让他结束
// }
// 第一种情况
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程结束");
});
// 启动之前打印一下线程状态
// 当前只是new 出来了一个Thread类的对象
System.out.println("启动之前的状态:" + t1.getState());
// 真正启动线程
t1.start();
// 等待一会,让系统去创建PCB
Thread.sleep(1000);
System.out.println("启动之后的状态:" + t1.getState());
// 等待线程结束
t1.join();
System.out.println("PCB是否存活:" + t1.isAlive());
System.out.println("线程执行完成后的状态:" + t1.getState());
}
}
当线程只执行简单的循环任务,同时也没有等待时,线程在启动之后的状态是Runnable,这也是大多数时候线程所处的状态。
public class Demo09_State {
public static void main(String[] args) throws InterruptedException {
// 创建线程
Thread t1 = new Thread(() -> {
// 第二种情况
for (int i = 0; i < 1000_0000_00; i++) {
// 啥也不干,等着让他结束
}
// 第一种情况
// try {
// Thread.sleep(3000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
System.out.println("线程结束");
});
// 启动之前打印一下线程状态
// 当前只是new 出来了一个Thread类的对象
System.out.println("启动之前的状态:" + t1.getState());
// 真正启动线程
t1.start();
// 等待一会,让系统去创建PCB
// Thread.sleep(1000);
System.out.println("启动之后的状态:" + t1.getState());
// 等待线程结束
t1.join();
System.out.println("PCB是否存活:" + t1.isAlive());
System.out.println("线程执行完成后的状态:" + t1.getState());
}
}
系统维护线程状态的方式
系统使用两个队列:就绪队列和阻塞队列来维护PCB的状态,PCB的线程改变之后,对应Java中Thread类的对象的状态就会发生改变。
使用工具查看线程及状态
使用JDK提供的工具查看线程及状态。在JDK的bin目录下,有一个可执行的应用程序jconsole.exe
,可以查看当前的进程和状态。
继续加油~