我想检查一下我的推理是否正确。
首先,我应该提供一些我正在努力解决的问题的细节。线程(程序的一部分)执行以下操作:
鉴于此,以下是我对线程状态的猜测:
READY TO RUN
州TIMED WAITING
州WAITING
州WAITING
州BLOCKED
州WAITING
州WAITING
州TERMINATED
州由于
答案 0 :(得分:10)
首先,您使用READY TO RUN
描述的州实际上是RUNNABLE。对于我的学士论文,我创建了一个过渡图,显示了不同的线程状态以及何时应该更改。你还没有描述getIn()
的语义,所以我想这只是一个随机的方法。
如果线程正在执行代码,例如您的方法getIn()
或getOut()
,则它是RUNNABLE
而不是WAITING
。 BLOCKED
实际上只是一个非常短的过渡状态,当线程试图声明锁定时,它总是被输入。如果锁不可用,则线程会一直被阻塞,并且无法执行您在步骤6中暗示的其他操作。此外,在调用Thread.sleep()
之后,它必须等待,直到时间结束时才能调用方法。
我会通过以下方式纠正它:
RUNNABLE
TIMED WAITING
RUNNABLE
BLOCKED
TIMED WAITING
BLOCKED
RUNNABLE
TERMINATED
免责声明:无法保证过渡。甚至可能是,JVM供应商决定以另一种方式实现底层机制,例如它可以通过旋转等待来实现阻塞。
如果您想深入了解此主题,请使用Profiler查找主题的状态。我写了一个我自己的状态来检测这些状态:Java Concurrency Profiler,但也有其他状态,例如 VisualVM 或 YourKit 。