目录
[1. 线程的状态](#1. 线程的状态)
[1.1 NEW](#1.1 NEW)
[1.2 RUNNABLE](#1.2 RUNNABLE)
[1.3 BLOCKED](#1.3 BLOCKED)
[1.4 WAITING](#1.4 WAITING)
[1.5 TIMED_WAITING](#1.5 TIMED_WAITING)
[1.6 TERMINATED](#1.6 TERMINATED)
[2. 线程状态的转移](#2. 线程状态的转移)
在多线程Thread类相关一文中已经介绍过进程的状态:就绪状态与阻塞状态;
若需详情请查看原文,链接如下:
【JavaEE】_多线程Thread类及其常用方法-CSDN博客
这个状态决定了系统调度进程的态度,但这只针对单线程进程的情况;
但实际中更常见的进程是多线程进程,此时的状态是绑定在线程上的;
其实在Linux操作系统中,PCB是与线程对应的,一个进程对应一组PCB;
"就绪"与"阻塞"状态都是针对系统层面上线程的状态,在java的Thread类中,对于线程的状态又进一步细化了;
1. 线程的状态
1.1 NEW
new表示安排了工作但还未开始行动:
Thread对象创建完成但还没有调用start();
即:Thread对象已经创建完成但内核中还没有线程;
是java内部设置的状态,与操作系统中PCB的状态没有联系;
java
Thread t = new Thread(()->{
});
//获取指定线程状态
System.out.println(t.getState());
t.start();
输出结果为:
1.2 RUNNABLE
runnable表示可工作的,又可分成正在工作中和即将开始工作:即就绪状态,
就绪状态包括 ①正在CPU上执行与 ②位于就绪队列中随时可以上CPU执行两种情况;
代码中如果没有sleep或其他可能导致阻塞状态的操作,代码大概率是处在RUNNABLE状态的;
java
Thread t = new Thread(()->{
while(true){
//处在一个快速高速循环的状态
}
});
t.start();
System.out.println(t.getState());
输出结果为:
1.3 BLOCKED
表示当前线程在等待锁,导致了阻塞状态(也是属于阻塞的状态之一);
当线程会使用到synchronized对线程进行加锁时会触发线程处于该状态;
后续进行介绍;
1.4 WAITING
表示当前线程在等待唤醒,导致了阻塞状态(也是属于阻塞的状态之一);
当线程使用wait等待唤醒时会触发线程处于该状态;
后续进行介绍;
1.5 TIMED_WAITING
当代码中调用了sleep或是join(等待时间上限),线程就会进入TIME_WAITING状态,表示当前线程在一定时间内处于阻塞状态(也是属于阻塞的状态之一);
java
Thread t = new Thread(()->{
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
Thread.sleep(1000);
System.out.println(t.getState());
输出结果为:
1.6 TERMINATED
terminated表示工作完成了
内核中的PCB已经执行完毕销毁了,但Thread对象仍然存在;
实际上内核PCB销毁了,代码中的Thread对象也就没有意义了,
此时为了将该Thread对象标识为无效,设定了Terminated状态;
并且一个线程terminated之后不能再重新start;
java
Thread t = new Thread(()->{
});
t.start();
//并不确定t线程与main线程哪个先执行完毕
try {
Thread.sleep(1000);
//令main线程休眠1s,此时t线程的状态大概率是Terminated
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(t.getState());
输出结果为:
2. 线程状态的转移
在实际开发过程中经常会遇到程序卡死这样的情况,即一些关键的线程阻塞了,此时分析线程阻塞时就可以从线程状态入手进行分析与修正;