线程的状态
线程总共由以下6种状态:
1.NEW Thread对象创建好了,但是还没有调用start方法在系统中创建线程!
2.TERMINATED 对象仍然存在,但是系统内部的线程已经执行完毕
3.RUNNABLE 就绪状态。表示线程或者在cpu上执行,或者准备就绪可以去cpu上执行!
4.TIMED_WAITING 指定时间的阻塞。就在到达一定的时间就会自动解除阻塞。使用sleep会进入这个状态。使用带有时间的join()也会进入这个状态!
5.WAITING 不带时间的阻塞(死等)必须要满足一定的条件,才会解除阻塞join或者wait都会进入WAITING。
6.BLOCKED 由于锁竞争,引起的阻塞!
通过图来表示👇
用下面的代码表示6个阶段👇
public class ThreadDemo25 {
private static final Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
// 创建线程对象,此时线程处于 NEW 状态
Thread thread = new Thread(() -> {
// 模拟线程执行一些任务,进入 RUNNABLE 状态
System.out.println("线程开始执行,当前状态: " + Thread.currentThread().getState());
// 模拟线程等待一段时间,进入 TIMED_WAITING 状态
try {
System.out.println("线程即将进入 TIMED_WAITING 状态");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 线程获取锁,模拟 BLOCKED 状态
synchronized (lock) {
try {
// 模拟线程等待,进入 WAITING 状态
System.out.println("线程即将进入 WAITING 状态");
lock.wait(); //这个会释放对象的锁,并进入该对象的等待池,等待被唤醒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("线程继续执行");
});
// 输出线程的初始状态:NEW
System.out.println("线程初始状态: " + thread.getState());
// 启动线程,使其进入 RUNNABLE 状态
thread.start();
// 短暂休眠,确保线程有机会进入 RUNNABLE 状态
Thread.sleep(100);
System.out.println("线程启动后状态: " + thread.getState());
// 主线程休眠,等待子线程进入 TIMED_WAITING 状态
Thread.sleep(500);
System.out.println("线程 TIMED_WAITING 状态: " + thread.getState());
Thread.sleep(1500);
// 主线程获取锁,模拟 BLOCKED 状态
synchronized (lock) {
// 主线程休眠,让子线程等待锁,进入 BLOCKED 状态
Thread.sleep(1000);
System.out.println("线程 WAITING 状态: " + thread.getState());
// 唤醒等待的线程,使其从 WAITING 状态恢复,此时这个对象还是有锁的。
//所以就发生了锁竞争!
lock.notify();
System.out.println("线程BLOCKED状态:"+thread.getState());
}
// 等待线程执行完毕,进入 TERMINATED 状态
thread.join();
System.out.println("线程最终状态: " + thread.getState());
}
}