当前位置: 首页 > 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());
http://www.xdnf.cn/news/60931.html

相关文章:

  • 讯联桌面TV版apk下载-讯联桌面安卓电视版免费下载安装教程
  • Python-Django系列—部件
  • 天翼云手机断开连接2小时关机
  • 2025大模型十大安全威胁(OWASP TOP 10 LLM 2025).pdf
  • 基于MuJoCo物理引擎的机器人学习仿真框架robosuite
  • Python常用的第三方模块【openpyxl库】读写Excel文件
  • 机器学习-08-推荐算法-案例
  • C# .NET如何自动实现依赖注入(DI)
  • AI大模型如何重塑科研:从灵感生成到学术写作的全链路变革
  • CH585单片机的LCD外设怎么驱动段式LCD
  • 【matlab】地图上的小图
  • 基于Java的不固定长度字符集在指定宽度和自适应模型下图片绘制生成实战
  • Linux学习笔记协议篇(六):SPI FLASH设备驱动
  • 华为VRP系统知识总结及案例试题
  • 下载pycharm遇到的问题及解决方法
  • 深度学习3.5图像分类数据集
  • elastic/go-elasticsearch与olivere/elastic
  • 乐家桌面安卓版2025下载-乐家桌面软件纯净版安装分享码大全
  • 【scikit-learn基础】--『监督学习』之 均值聚类
  • GPT,Genini, Claude Llama, DeepSeek,Qwen,Grok,选对LLM大模型真的可以事半功倍!
  • 发布事件和Insert数据库先后顺序
  • GeoJSON 格式详解与使用指南
  • Macbook IntelliJ IDEA终端无法运行mvn命令
  • 【2025面试Java常问八股之redis】zset数据结构的实现,跳表和B+树的对比
  • 1.Vue3 - 创建Vue3工程
  • JavaEE--2.多线程
  • RHCE 练习二:通过 ssh 实现两台主机免密登录以及 nginx 服务通过多 IP 区分多网站
  • 【基础算法】二分算法详解
  • 科大讯飞Q1营收46.6亿同比增长27.7%,扣非净利同比增长48.3%
  • [c语言日寄]免费文档生成器——Doxygen在c语言程序中的使用