建设网站计划 ppt上海优化公司有哪些
线程总共由以下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("线程继续执行");});// 输出线程的初始状态:NEWSystem.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());}
}