当前位置: 首页 > news >正文

线程的状态流转

从JAVA源码可以得出有6种状态

NEW、RUNNABLE、BLOCKED、WAITING、TIME_WAITING、TERMINATED
image
通过代码解释说明

  1. 初始化状态是NEW
    public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> {});  System.out.println(thread.getState());
    }
    
    执行结果
    NEW
    
  2. 运行过程的状态是RUNABLE
    public static void main(String[] args) throws InterruptedException {  Thread thread = new Thread(() -> {  while (true) { }  });  thread.start();  Thread.sleep(500);  System.out.println(thread.getState());  
    }
    
    执行结果的确是RUNNABLE
    RUNNABLE
    
  3. 主线程被上锁了,创建的线程无法获取锁,此时的状态是BLOCKED
    public class ThreadStatus {  public static Object obj = new Object();  public static void main(String[] args) throws InterruptedException {  Thread thread = new Thread(() -> {  synchronized (obj) {  while (true){  }  }  });  // 此时住线程持有锁  synchronized (obj){  // 开启新的线程,因为主线程持有锁所以拿不到锁被阻塞  thread.start();  Thread.sleep(500);  System.out.println(thread.getState());  }  }
    }
    
    执行结果是BLOCKED
    BLOCKED
    
  4. 当创建的线程持有锁时状态是WAITING,
    public class ThreadStatus {  public static Object obj = new Object();  public static void main(String[] args) throws InterruptedException {Object obj = new Object();Thread thread = new Thread(() -> {synchronized (obj) {  // 步骤2:新线程获取锁try {obj.wait();   // 步骤3:释放锁,进入WAITING状态} catch (InterruptedException e) {throw new RuntimeException(e);}// 步骤6:被唤醒后重新获取锁,继续执行}});thread.start();           // 步骤1:启动新线程Thread.sleep(500);        // 步骤4:主线程睡眠System.out.println(thread.getState());  // 输出:WAITINGsynchronized (obj) {      // 步骤5:主线程可以获取锁(因为新线程已释放)obj.notify();         // 唤醒新线程}                         // 主线程释放锁Thread.sleep(500);System.out.println(thread.getState());  // 输出:TERMINATED}  
    }
    
    执行结果是
    WAITING
    TERMINATED
    
  5. 当线程处于休眠(sleep())中,状态即为TIMED_WAITING
    public static void main(String[] args) throws InterruptedException {  Thread thread = new Thread(() -> {  try {  Thread.sleep(10000);  } catch (InterruptedException e) {  throw new RuntimeException(e);  }  });  thread.start();  Thread.sleep(500);  System.out.println(thread.getState());  
    }
    
    执行结果是
    TIMED_WAITING
    
  6. 线程执行结束后状态即为TERMINATED
    public static void main(String[] args) throws InterruptedException {  Thread thread = new Thread(() -> {  try {  Thread.sleep(300);  } catch (InterruptedException e) {  throw new RuntimeException(e);  }  });  thread.start();  Thread.sleep(500);  System.out.println(thread.getState());  
    }
    
    执行结果
    TERMINATED
    
http://www.jsqmd.com/news/4341/

相关文章:

  • 从方向向量获取y轴旋转值
  • verilog一些操作符和特殊函数
  • AI工作流详解以及应用场景(AI)
  • 20250820_浙江省职业职工技能竞赛_crypto
  • 非结构网格中计算场梯度的手段比较
  • 第一章pytorch安装
  • 钡铼技术:2025工业智能体元年,盘点已推出的工业AI大模型总有一款适合您
  • 深入解析:i.MX6ULL移植内核6.6(一)修改网络驱动和LCD驱动
  • 微算法科技(NASDAQ MLGO)使用基于深度学习的物理信息神经网络(PINN),增强区块链IoT网络交易中的入侵检测
  • 前端模块化——彻底搞懂AMD、CMD、ESM和CommonJS
  • 【MySQL】XML中基于已有查询代码,进一步做汇总统计
  • 别再一张证件照用到底了,我建了个“个人形象库”
  • Vue3.5 + Node.js + Express 实现完整登录注册鉴权流程
  • 【SPIE出版】第七届地球科学与遥感测绘国际学术会议(GRSM 2025)
  • ARL(灯塔)安装步骤--超简单!!
  • 实用指南:Java基础(十四):枚举类详解
  • 传统开水壶升级智能水壶低成本开发方案WT588F02KD-32N
  • 基于MATLAB的经典车辆路径问题(VRP)求解方法详解
  • kali复现arp欺骗
  • VGGT: Visual Geometry Grounded Transformer
  • 14种纯css3对话气泡样式代码
  • 微信小程序使用地图map 实现定位和实时绘画轨迹
  • 嵌入式入门,基于keil5用stm32寄存器和标准库实现LED流水灯
  • AI agent编程随记
  • 小人鱼的数学题 - Li
  • 再见 Claude Code!玩转 CodeX CLI 的 16 个实用小技巧,效率拉满!!
  • 【IEEE出版】第五届电气工程与机电一体化技术国际学术会议(ICEEMT 2025)
  • [新教程] Linux服务器修改ssh服务端口
  • HT-AD5PS-1+:1–400 MHz“五路小方糖”,一张板子省掉三种料!
  • 《嵌入式驱动(二):驱动编写基本概念》