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

打印 上一主题 下一主题

主题 1545|帖子 1545|积分 4635

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
当你的多线程代码结构很复杂的时候很难找出bug的原因地点,此时我们可以使用getState()方法获取该线程当前的状态,通过观察其状态是阻塞了还是因为没有启动等原因导致的。
状态描述NEW安排了工作,还未开始行动RUNNABLE可工作的,又可以分成正在工作中和即将开始工作BLOCKED这几个都表现列队等着其他事情WAITING这几个都表现列队等着其他事情TIMED_WAITING这几个都表现列队等着其他事情TERMINATED工作完成了 NEW

此状态说明这个线程已经被创建了,但是没有start()实验任务。
  1.    Thread t = new Thread(() -> {
  2.        for (int i = 0; i < 1000_0000; i++) {
  3.        }
  4.    }, "状态");
  5.    System.out.println(t.getName() + ": " + t.getState());
复制代码
RUNNABLE

这个状态表明他已经被创建,但是还没有实验完任务,在这个过程中都是RUNNABLE状态。
  1.    Thread t = new Thread(() -> {
  2.        for (int i = 0; i < 1000_0000; i++) {
  3.        }
  4.    }, "状态");
  5.    t.start();
  6.    while (t.isAlive()) {
  7.        System.out.println(t.getName() + ": " + t.getState());
  8.    }
复制代码
TERMINATED

已经实验完任务了,是线程竣事的标志
  1. Thread t = new Thread(() -> {
  2.      for (int i = 0; i < 1000_0000; i++) {
  3.      }
  4. }, "状态");
  5. t.start();
  6. t.join();
  7. System.out.println(t.getName() + ": " + t.getState());
复制代码
WAITING

当他在使用wait,join,sleep方法等待的时候,并且方法没有传入参数,也就是死等的时候,需外部唤醒(如 notify()),处于此状态。
  1.   Thread t1 = Thread.currentThread();
  2.   Thread t = new Thread(() -> {
  3.       try {
  4.           t1.join();
  5.       } catch (InterruptedException e) {
  6.           throw new RuntimeException(e);
  7.       }
  8.   }, "状态");
  9.   t.start();
  10.   Thread.sleep(10);
  11.   System.out.println(t.getState());
复制代码
TIMED_WAITING

当他在使用wait,join,sleep方法等待的时候,并且传入参数会进入此状态,超时后主动唤醒或外部提前唤醒,和WAITING的区别就是是否传入参数的区别。
  1.   Thread t1 = Thread.currentThread();
  2.   Thread t = new Thread(() -> {
  3.       try {
  4.           Thread.sleep(1000);
  5.       } catch (InterruptedException e) {
  6.           throw new RuntimeException(e);
  7.       }
  8.   }, "状态");
  9.   t.start();
  10.   Thread.sleep(10);
  11.   System.out.println(t.getState());
复制代码
BLOCKED

因为锁竞争导致的等待时,会进入此状态,如果不停是此状态可能是陷入了死锁。
  1. //这个案例是个死锁。
  2.   Object locker1 = new Object();
  3.   Object locker2 = new Object();
  4.   Thread t1 = new Thread(()->{
  5.       synchronized (locker1) {
  6.           try {
  7.               Thread.sleep(1);
  8.           } catch (InterruptedException e) {
  9.               throw new RuntimeException(e);
  10.           }
  11.           synchronized (locker2) {
  12.           }
  13.       }
  14.       System.out.println("t1执行完毕");
  15.   });
  16.   Thread t2 = new Thread(()->{
  17.       synchronized (locker2) {
  18.           synchronized (locker1) {
  19.           }
  20.       }
  21.       System.out.println("t2执行完毕");
  22.   });
  23.   t1.start();
  24.   t2.start();
  25.   Thread.sleep(100);
  26.   System.out.println(t1.getState());
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表