我使用testng
作为我的自动化框架。当在测试用例中执行下面的代码行时,会产生java.lang.IllegalMonitorStateException
。
有人可以建议如何解决这个问题吗?我的方法应该等待2分钟。
{
TimeUnit.MINUTES.wait(2);
}
答案 0 :(得分:0)
正如javadoc所说:
当前线程必须拥有此对象的监视器。
换句话说,您只能在Object.wait
方法或块中的对象上调用synchronized
来锁定您正在等待的对象。
您应该使用Thread.sleep(...)
或TimeUnit.sleep(...)
。阅读相应的javadoc以了解参数的单位。
如果您使用wait
,那么您的使用情况也会因其他原因而不正确。虽然看起来就像你在等待2分钟,但你实际等待2毫秒......因为你正在调用Object
wait
的实现}}。如果您想使用TimeUnit
版本,则代码需要如下所示:
synchronized lock {
TimeUnit.MINUTES.timedWait(lock, 2);
}
其中lock
是我们用于锁定的合适(私有,非共享)对象。
另外,请注意,如果通知锁定/锁定对象,那么您的wait(...)
电话会提前唤醒。如果不是所有您只想等待一段时间的情况,这会导致wait
和不恰当的解决方案。
答案 1 :(得分:0)
使用TimeUnit
和Lock
时,您必须注意不要意外调用从java.lang.Object
继承的方法,即wait
,notify
等因为它们有完全不同的语义。
对于您想要达到的目标,您必须致电TimeUnit.MINUTES.sleep(2)
。