我想检查我的推理是否正确。
首先,我应该提供一些有关我要解决的问题的详细信息。线程(程序的一部分)执行以下操作:
- 开始
- 它调用 Thread.sleep (20ms)
- 它调用 getIn() 方法
- 它尝试获取锁 (lock.lock())
- 如果成功获得锁,它会调用 Thread.sleep (100ms)
- 如果锁不可用,它会调用 waitingCond.await()
- 在调用 Thread.sleep (100ms) 后调用 lock.unlock()
- 它调用另一个方法 getOut()
- 它终止 (thread.join())
鉴于此,以下是我对线程状态的猜测:
READY TO RUN
状态TIMED WAITING
状态WAITING
状态WAITING
状态BLOCKED
状态WAITING
状态WAITING
状态TERMINATED
状态
谢谢
最佳答案
首先,你用READY TO RUN
描述的状态实际上是RUNNABLE .在我的学士论文中,我创建了一个转换图来显示不同的线程状态以及它们何时应该改变。你还没有描述getIn()
的语义,所以我猜它只是一个随机方法。
如果线程正在执行代码,例如您的方法 getIn()
或 getOut()
它是 RUNNABLE
而不是 等待
。 BLOCKED
实际上只是一个很短的过渡状态,当线程试图申请锁时总是会进入这个状态。如果锁不可用,线程将继续被阻塞,并且无法执行您在第 6 步中暗示的其他操作。它也无法在调用 Thread.sleep()
之后调用方法,它必须等待,直到时间过去了。
我会按以下方式更正它:
可运行
定时等待
可运行
已阻止
定时等待
已阻止
可运行
已终止
免责声明:不保证转换。甚至可能是,JVM 供应商决定以另一种方式实现底层机制,例如它可以通过自旋等待实现阻塞。
如果您想更深入地研究这个主题,请使用 Profiler 来找出线程的状态。我自己写了一个来检测这些状态:Java Concurrency Profiler ,但也有其他的,例如 VisualVM 或 YourKit。
关于java - 线程状态java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11265289/