我有一个集成测试,可以启动getty,然后启动一个Web应用程序。 Web应用程序将跨越一些将运行初始化任务的异步线程。之后就可以进行测试了。现在因为我等待其中一个任务完成,我想把静态监视器放在共享类中:
private static Object bootstrapDone = new Object();
使用以下访问方法:
public static void signalEsBoostrapCompleted(){
synchronized (bootstrapDone){
bootstrapDone.notifyAll();
}
}
public static void waitEsBoostrapCompleted() throws InterruptedException {
synchronized (bootstrapDone){
bootstrapDone.wait(20000);
}
}
如果我在测试中运行它,我得到: 线程中的异常"线程-11" java.lang.IllegalMonitorStateException at java.lang.Object.notifyAll(Native Method)
从notifyAll所在的行。我不知道为什么会这样。 有人可以帮忙吗?
答案 0 :(得分:2)
我能想到的唯一明显的方法是:在调用bootstrapDone
和调用synchronized(bootstrapDone)
之间,某个东西正在改变另一个线程上bootstrapDone.notifyAll()
的值。< / p>
让bootstrapDone
成为最终版,任何无法再编译的内容都可能是罪魁祸首。