如何找出线程已处于等待状态的时间

问题描述:

简短版本:在java中,有没有办法找出线程已处于等待状态的时间?如果相关,我所指的对象将通过调用condition.await()发送到等待状态。如何找出线程已处于等待状态的时间

龙版本:(这是一个家庭作业问题)

我正在创建10个供应商线程和10个消费者线程,具有同步的共同方案“会议室”。供应商线程会休眠一段时间,产生一个随机数,并且(如果会议室的数据字段为空),则将该随机数放在该字段中,并将其标记为具有相同标识的使用者线程。如果数据字段不是空的,则它们在被占用的条件下await。消费者线程检查会议室中的数据是否标记为他们:如果不是,他们await在错误的条件。如果是这样,他们 他们将数字存储在数据字段中,将其设置为空,并呼叫Occupied.signalAll()通知供应商线程数据字段现在为空。 (供应商线程呼叫wrongID.signalAll()通知消费者线程新数据在该字段中)。

我有几个诊断println声明(供应商0进入会议室,离开数据/供应商1进入候诊室...),并且一切似乎都正常工作。当线程唤醒时,我还想打印语句,显示它们处于等待状态的时间。这可能吗?

而且,如果有人看到我的逻辑任何瑕疵这里,随意点出来给我(这是我首次涉足多线程之一)

+1

jvisualvm位于您的java运行库的bin目录中,并且会显示每个线程的生存时间表。也许这是你喜欢的? – flup 2013-04-06 22:38:04

正如你不能覆盖wait()(这是final)或Condition(除非你自己制作LockCondition ..),我会建议尽可能简单。

我假设你有一些像这样的代码在你的线程(消费者和供应商):

while (conditionForWaiting) { 
    condition.await() 
} 

有了这一点,你可以在进入while循环之前System.currentTimeMillis()添加时间戳(如果conditionForWaiting是真的! )。然后,只需打印(System.currentTimeMillis()-startTime)/1000即可打印线程等待的秒数。或者把它保存到一个领域并且有一个吸气剂,无论你想用它做什么。