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

多线程出bug不知道如何调试?java线程几种常见状态

当你的多线程代码结构很复杂的时候很难找出bug的原因所在,此时我们可以使用getState()方法获取该线程当前的状态,通过观察其状态是阻塞了还是因为没有启动等原因导致的。

状态描述
NEW安排了工作,还未开始行动
RUNNABLE可工作的,又可以分成正在工作中和即将开始工作
BLOCKED这几个都表示排队等着其他事情
WAITING这几个都表示排队等着其他事情
TIMED_WAITING这几个都表示排队等着其他事情
TERMINATED工作完成了

NEW

此状态说明这个线程已经被创建了,但是没有start()执行任务。

   Thread t = new Thread(() -> {for (int i = 0; i < 1000_0000; i++) {}}, "状态");System.out.println(t.getName() + ": " + t.getState());

RUNNABLE

这个状态表明他已经被创建,但是还没有执行完任务,在这个过程中都是RUNNABLE状态。

   Thread t = new Thread(() -> {for (int i = 0; i < 1000_0000; i++) {}}, "状态");t.start();while (t.isAlive()) {System.out.println(t.getName() + ": " + t.getState());}

TERMINATED

已经执行完任务了,是线程结束的标志

 Thread t = new Thread(() -> {for (int i = 0; i < 1000_0000; i++) {}}, "状态");
t.start();
t.join();
System.out.println(t.getName() + ": " + t.getState());

WAITING

当他在使用wait,join,sleep方法等待的时候,并且方法没有传入参数,也就是死等的时候,需外部唤醒(如 notify()),处于此状态。

  Thread t1 = Thread.currentThread();Thread t = new Thread(() -> {try {t1.join();} catch (InterruptedException e) {throw new RuntimeException(e);}}, "状态");t.start();Thread.sleep(10);System.out.println(t.getState());

TIMED_WAITING

当他在使用wait,join,sleep方法等待的时候,并且传入参数会进入此状态,超时后自动唤醒或外部提前唤醒,和WAITING的区别就是是否传入参数的区别。

  Thread t1 = Thread.currentThread();Thread t = new Thread(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}, "状态");t.start();Thread.sleep(10);System.out.println(t.getState());

BLOCKED

因为锁竞争导致的等待时,会进入此状态,如果一直是此状态可能是陷入了死锁。

//这个案例是个死锁。Object locker1 = new Object();Object locker2 = new Object();Thread t1 = new Thread(()->{synchronized (locker1) {try {Thread.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (locker2) {}}System.out.println("t1执行完毕");});Thread t2 = new Thread(()->{synchronized (locker2) {synchronized (locker1) {}}System.out.println("t2执行完毕");});t1.start();t2.start();Thread.sleep(100);System.out.println(t1.getState());

相关文章:

  • 《C/C++预定义宏深度剖析:编译上下文获取指南》
  • RSS 2025|苏黎世提出「LLM-MPC混合架构」增强自动驾驶,推理速度提升10.5倍!
  • unity打包安卓时的签名文件jks转换keystore
  • 欧拉-国产操作系统替代产品如何
  • 使用openssl为localhost创建自签名
  • 大模型AI的运行逻辑与准确性保障机制——以DeepSeek与豆包为例
  • K8s使用LIRA插件更新安全组交互流程
  • MMIO、IOMAP 和 IOMMU 总结
  • 一文了解相位阵列天线中的真时延
  • Vibracostic EDI 需求分析
  • 单例模式的使用场景 以及 饿汉式写法(智能指针)
  • LangChain、LlamaIndex 和 ChatGPT 的详细对比分析及总结表格
  • 【AI News | 20250421】每日AI进展
  • 如何将Qt程序打包成应用程序?
  • visionpro案例: 轴承缺珠检测
  • Java学习手册:Cookie 与 Session 管理
  • HOW MUCH POSITION INFORMATION DO CONVOLUTIONAL NEURAL NETWORKS ENCODE?
  • web原生API AbortController网络请求取消方法使用介绍:防止按钮重复点击提交得最佳方案
  • 总结设计测试用例的万能公式
  • 基于LLM的响应式流式处理实践:提升用户体验的关键技术
  • 神舟二十号任务完成最后一次全区合练,发射场做好发射前各项准备
  • 纪念沈渭滨︱沈渭滨先生与新修《清史》
  • 山东临沂市市长张宝亮履新市委书记
  • 寒武纪一季度营收猛增42倍,净利3.55亿元,连续两个季度盈利
  • 特朗普:乌克兰问题谈判短期内若无进展美将不再斡旋
  • 因在罗博特科并购项目中执业违规,东方证券、国浩所均遭警示