目录
进程有状态,前文我们提过,分别是就绪和阻塞状态,这俩种状态决定了系统如何调用这个进程
这种情况下大部分都是针对进程中只有一个线程的情况下,更常见的是一个进程中包含了多个线程,这里所谓的状态,是和线程绑在一起的,在Java中Thread类中,对线程的状态,又进行了细化
🍉线程的几种状态
🍉NEW(线程未调用状态)
NEW状态:就是线程创建好了,但是没有调用start()时的状态
🌰 :
public class TestDemo9 {
public static void main(String[] args) {
Thread thread = new Thread(()->{
});
System.out.println(thread.getState());
thread.start();
}
}
🍉TERMINATED(线程完成状态)
TREMINNATED:系统中线程已经执行完毕,销毁了,但是Thread创建的对象还在,此时线程的状态,即任务完成后的状态
🌰 :
public class TestDemo9 {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
});
thread.start();
System.out.println(thread.getState());
Thread.sleep(1000);
System.out.println(thread.getState());
}
}
此时,我们会返现代码中存在sleep()方法,这是因为main()与线程thread是并发执行的,不加sleep()所获取的就是main()线程的状态
🍉RUNNABLE(就绪状态)
RUNNBALE:就绪状态,处于这个状态的线程,存储在就绪队列上,此时的线程随时可能被调度到CPU上,如果没有sleep()等堵塞队列的方法,线程大概率是就绪的状态
🌰 `
public class TestDemo9 {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
while(true){
//此处什么都不能有,因为不确定代码要进行什么操作,如果进行了堵塞操作,代码就不是就绪状态了
}
});
thread.start();
Thread.sleep(1000);
System.out.println(thread.getState());
}
}
🍉阻塞状态
🍉TIMED_WAITING
TIMED_WAITING:代码中调用了堵塞的方法,如sleep(),或者join()超时等待 代码就是进入此状态
意思就是当前的线程在一定时间内,是堵塞的状态,等时间到了之后堵塞状态解除,这种状态就是TIMED_WAITING,也是阻塞状态之一
🌰
public class TestDemo9 {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
Thread.sleep(1000);
System.out.println(thread.getState());
}
}
🍉BLOCKED
阻塞状态之一,当线程使用synchronized后,线程正在等待锁,这就导致了线程堵塞
🍉WAITING
阻塞状态之一,当前状态等待唤醒(线程使用了wait方法),导致了堵塞,
🥝 为什么要了解线程的这几种状态
为什么要细分这几种状态呢?这是非常有必要的
这是因为在日常生活中,我们的程序难免会发生卡死,这是我们需要知道程序为什么卡死,那么我们就需要知道此时的程序处在什么状态,在往下进行分析卡死的原因