线程的状态
线程状态的分类
线程作为操作系统调度的基本单位,在被调度时也会有很多种状态;
线程一般分为以下几种:
状态 | 解释 |
NEW | 安排了工作, 还未开始行动 |
RUNNABLE | 可工作的. 又可以分成正在工作中和即将开始工作 |
BLOCKED | 这几个都表示排队等着其他事情 |
WAITING | 这几个都表示排队等着其他事情 |
TIMED_WAITING | 这几个都表示排队等着其他事情 |
TERMINATED | 工作完成了 |
其中WAITING,TIMED_WAITING,TERMINATED都属于阻塞(表示PCB都处于阻塞队列中),这几个状态是不同原因的阻塞
线程状态的转移
线程状态的打印
打印线程的状态用getState方法:
打印线程这行代码在调用start方法之前,所以此时操作系统内核并未创建PCB,所以线程的状态是NEW。
线程的切换
NEW和TERMINATED
NEW:表示创建了线程所需要执行的任务,但是还没有工作;
TERMINATED:表示线程已经执行完任务,PCB释放了
代码如下:
public class Test4 {
public static void main(String[] args) {
Thread t = new Thread(() -> {
System.out.println("hello");
});
System.out.println(t.getState());
t.start();
try {
t.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(t.getState());
}
}
第一次输出NEW,因为此时只是创建了线程实例,指明了线程所要执行的任务,当线程执行完(打印hello)任务后,再次调用getState方法之后输出则是TERMINATED.
RUNNABLE
RUNNABLE:可工作的. 又可以分成正在工作中和即将开始工作,表示此时有线程正在CPU上执行或者等待执行
public class Test4 {
public static void main(String[] args) {
Thread t = new Thread(() -> {
for (int i = 0; i < 1000000; i++) {
}
});
System.out.println(t.getState());
t.start();
System.out.println(t.getState());
try {
t.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(t.getState());
}
}
因为线程执行的任务是1000000不做任何操作,此时获取到线程的状态就是RUNNABLE.
TIMED_WAITING
TIMED_WAITING:表示这几个都表示排队等着其他事情,一般是因为线程在执行的时候进行了sleep操作;
public class Test3 {
public static void main(String[] args) {
Thread t = new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
System.out.println(t.getState());
t.start();
for (int i = 0; i < 100; i++) {
System.out.println(t.getState());
}
try {
t.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(t.getState());
}
此时在输出NEW和TERMINATED之间分别输出了很多的RUNNABLE和TIMED_WAITING,因为当创建的线程在执行操作到sleep时,此时线程的状态就是TIMED_WAITING,当休眠结束线程继续执行时,此时线程的状态就是RUNNABLE.