5

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

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

  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状态

谢谢

4

1 回答 1

10

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

如果线程正在执行代码,例如 on 您的方法getIn(),或者getOut()它 isRUNNABLE和 not WAITINGBLOCKED实际上只是一个很短的过渡状态,总是在线程试图申领锁时进入。如果锁不可用,则线程将继续被阻塞,并且无法执行您在步骤 6 中暗示的其他操作。此外,在调用Thread.sleep()它必须等待之后,它无法调用方法,直到时间过去。

我会通过以下方式纠正它:

  1. RUNNABLE
  2. TIMED WAITING
  3. RUNNABLE
  4. BLOCKED
  5. TIMED WAITING
  6. BLOCKED
  7. RUNNABLE
  8. TERMINATED

线程状态转换

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

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

于 2012-07-02T23:04:09.153 回答