目录
目录
前言
本篇博客主要介绍线程的六种状态,以及在什么情况下会处于什么状态。
一、获取线程状态
要获取线程的状态,我们可以通过线程的实例调用getState()方法来获取。
二、NEW状态(初始状态)
NEW状态就是线程已经创建出来了,但是还没有执行start()方法,这时候我们的线程就处于NEW状态。
public static void main(String[] args) {
Thread t = new Thread(()->{
System.out.println("我是线程t");
});
System.out.println(t.getState());//还没启动就是处于NEW状态
}
运行结果:
三、 RUNNABLE状态(运行时状态)
RUNNABLE状态就是说明线程正在cpu运行的或者随时可以去cpu上运行的状态。
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(()->{
while (true){
}
});
t.start();
System.out.println(t.getState());
}
运行结果 :
四、BLOCKED(阻塞状态)
BLOCKED就是阻塞状态表示线程正在等待锁,而陷入的状态。也可以理解为等待锁状态。
当线程取得锁,就会从阻塞状态转变为就绪状态。
代码演示:
public static void main(String[] args) throws InterruptedException {
Object locker = new Object();
Thread t1 = new Thread(()->{
synchronized (locker){
while(true){//让这里一直为true循环,一直占着锁
}
}
});
Thread t2 = new Thread(()->{
synchronized (locker){//t2会一直得不到锁,就会陷入BLOCKED状态
while(true){
}
}
});
t1.start();
t2.start();
Thread.sleep(1000);//休眠1s确保t1,t2已经开始执行
System.out.println(t2.getState());
}
运行结果:
五、WAITING(等待状态)
一般处于waiting状态有两种可能,第一可能是某一个线程调用join方法在等待另一个线程结束再执行;也可能是处于正在调用wait()方法,等待其他线程。
代码展示调用join()方法时的状态:
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
while (true){
}
});
Thread t2 = new Thread(()->{
while(true){
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
Thread.sleep(100);
System.out.println(t2.getState());
}
运行结果:
六、TIMED_WAITING(超时等待状态)
TIMED_WAITING可以理解为具有指定等待时间的线程正在处于的等待状态;
一般下列情况会出现这种状态:
1.调用Thread.sleep()方法,该方法会让线程休眠一段时间,使得其他线程可以获得cpu
2.join()方法,调用t.join方法是让线程等待某一个调用join方法的线程结束再继续执行
3.wait()方法,可以指定wait时间,如果超过等待时间,则不需要notify或者notifyAll唤醒也会执行
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(()->{
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
Thread.sleep(100);
System.out.println(t.getState());
}
运行结果:
七、TERMINATED (终止状态)
TERMINATED状态就是线程已经执行结束了,但是线程的引用还存在的状态。
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
for (int i = 0; i < 100; i++) {
}
});
t1.start();
Thread.sleep(1000);//休眠1s保证进程执行完毕
System.out.println(t1.getState());
}
八、线程状态流程图
这是大概的线程状态流程图;有一条主线和三条支线构成
主要由这条主线NEW→RUNNABLE→TERMINATED加上RUNNABLE这三条支线构成了线程的状态图