java - 线程状态java

标签 java multithreading

我想检查我的推理是否正确。

首先,我应该提供一些有关我要解决的问题的详细信息。线程(程序的一部分)执行以下操作:

  1. 开始
  2. 它调用 Thread.sleep (20ms)
  3. 它调用 getIn() 方法
  4. 它尝试获取锁 (lock.lock())
  5. 如果成功获得锁,它会调用 Thread.sleep (100ms)
  6. 如果锁不可用,它会调用 waitingCond.await()
  7. 在调用 Thread.sleep (100ms) 后调用 lock.unlock()
  8. 它调用另一个方法 getOut()
  9. 它终止 (thread.join())

鉴于此,以下是我对线程状态的猜测:

  1. READY TO RUN 状态
  2. TIMED WAITING 状态
  3. WAITING 状态
  4. WAITING 状态
  5. BLOCKED 状态
  6. WAITING 状态
  7. WAITING 状态
  8. TERMINATED 状态

谢谢

最佳答案

首先,你用READY TO RUN描述的状态实际上是RUNNABLE .在我的学士论文中,我创建了一个转换图来显示不同的线程状态以及它们何时应该改变。你还没有描述getIn()的语义,所以我猜它只是一个随机方法。

如果线程正在执行代码,例如您的方法 getIn()getOut() 它是 RUNNABLE 而不是 等待BLOCKED实际上只是一个很短的过渡状态,当线程试图申请锁时总是会进入这个状态。如果锁不可用,线程将继续被阻塞,并且无法执行您在第 6 步中暗示的其他操作。它也无法在调用 Thread.sleep() 之后调用方法,它必须等待,直到时间过去了。

我会按以下方式更正它:

  1. 可运行
  2. 定时等待
  3. 可运行
  4. 已阻止
  5. 定时等待
  6. 已阻止
  7. 可运行
  8. 已终止

Thread State Transitions

免责声明:不保证转换。甚至可能是,JVM 供应商决定以另一种方式实现底层机制,例如它可以通过自旋等待实现阻塞。

如果您想更深入地研究这个主题,请使用 Profiler 来找出线程的状态。我自己写了一个来检测这些状态:Java Concurrency Profiler ,但也有其他的,例如 VisualVMYourKit

关于java - 线程状态java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265289/

相关文章:

java - org.hibernate.HibernateException : Current transaction is not in progress

c++ - 我们如何强制变量共享?

java - 显示 ThreadLocal 使用要求的示例

java - 在具有最小索引的数组中找到第一个重复元素

java - 反转整数但得到 `StringIndexOutOfBoundsException`

java - 如何在 iText pdf 中旋转 JFreeChart

java - 将 org.apache.avro.util.Utf8 转换为 java.lang.String

c++ - 用 fork() 模拟线程

java - 事务系统中未正确显示线程的名称

c - 在所有生产者都结束之后,如何正确终止多个消费者?