+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
🚀欢迎大家来到我的博客⭐
🚀本人是双非软工专业的一名大二学生,让我们共同努力,冲击校招!!!⭐
🚀本章博客介绍的是关于Thread的常用方法⭐
🚀一下是我的QQ号,欢迎大家来进行技术交流!!⭐
🚀QQ:2641566921⭐
🚀以后会更新一些笔试有关的题目,请大家多多关注⭐
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
目录
线程的状态
线程在他的生命周期中由很多不同的状态,这些状态通常为 NEW状态 RUNNABLE状态 BLOCKED状态和WAITING状态,还有TIME_WAITING和TERMINATED状态。
状态 | 意义 |
NEW | 创建了Thread的对象但是还没有调用start方法 |
TERMINATED | 线程已经执行完成run方法,pcb已经执行完成,但是Thread对象还在 |
RUNNABLE | 可运行的,分为正在工作和即将开始工作 |
WAITING | 表示不同原因的阻塞 |
TIME_WAITING | 表示不同原因的阻塞 |
BLOCK | 表示不同原因的阻塞 |
NEW状态
NEW状态是线程的初始状态当一个Thread对象被创建出来的时候,在start之前就是处于NEW状态,此时的线程没有被启动也没有开始执行,此时的线程没有被分配内存资源,也没有被加载到线程调度器当中。在创建对象之后程序员只调用一次started方法就可以使进程进入到就绪状态。
下面是代码的例子,在之前的博客中,我们介绍了Thread的一个方法getState()方法获得线程得状态。
public class Demo8 {
public static void main(String[] args) {
Thread thread = new Thread(()->{
System.out.println("Thread running");
});
System.out.println(thread.getState());
thread.start();
}
}
打印线程状态的那一行代码之前已经创建好了Thread的类,处于实例化之后,start()之前,此时的状态就是NEW状态。
TERMINATED状态
此状态表示进程已经运行完毕并且结束,但是此时还是存在Thread的实例化类,当线程执行完毕之后,他的状态就会变成TERMINATED,线程变成这个状态之后线程就不会在进入到其他的状态里了。
接下来我们使用代码来验证一下。
Thread thread1 = new Thread(()->{
System.out.println("Thread running");
});
System.out.println(thread1.getState());
thread1.start();
Thread.sleep(1000);
System.out.println(thread1.getState());
我们为了保证我们创建的新进程能够在getState方法之前执行完,我们让主线程执行的慢一些,加一个sleep
我们可以看到,在run方法进行完成之后,进程的状态被更改成为TERMINATED。
因为线程进入TERMINATED状态之后,就不会再该笔那线程的状态了,所以也能解释为什么线程只能被start一次,因为当线程再一次被start之后,线程的状态肯定会被改变。
RUNNABLE状态
RUNNABLE状态分为两种情况,一种是线程在就绪队列中,准备随时去cpu进行执行,另一种是线程处于正在执行的状态。
Thread thread1 = new Thread(()->{
while(true){
System.out.println("Thread running");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
return;
}
}
});
System.out.println(thread1.getState());
thread1.start();
System.out.println(thread1.getState());
thread1.interrupt();
System.out.println(thread1.getState());
其实简单来说,线程在start方法之后,或者在执行run方法的时候,就可以理解为线程处于RUNNABLE的状态
WAITING状态
在java中WAITING是线程的一种状态表示线程正在等待某个线程的发生同时也不会消耗CPU的资源,线程进入WAITING的原因包括但是不限于等待IO操作,等待另一个线程的通知,等待锁的释放。我们在这里简单的介绍一下WAITING,等到我们学习到notify()和notifyAll()的时候再给大家详细的讲解。
BLOCKED状态
blocked状态也是一种阻塞的状态,表示的是线程因为等待锁的释放而被阻塞,当一个线程想要获取到某个对象的锁的时候,如果这个对象已经被其他的线程占用,发起请求锁的这个线程就会进入到BLOCKED状态,并且等待锁的释放,当其他的线程释放了锁之后等待的线程就会重新进入RUNNABLE状态,并且重新获取到锁。
我们要注意区分WAITING和BLOCKED状态,WAITING状态表示线程因为等待某个条件而被阻塞吗,而不会和BLOCKED一样去一直尝试获取到锁。
TIME_WAITING状态
TIME_WAITING状态与WAITING状态相似,只不过会设置一个等待时间,如果超出时间,线程就会被自动的唤醒。
以上就是线程的几种不同的状态,大家需要好好掌握,这也是面试中经常考察的内容。