我在代码中遇到了IllegalMonitorStateException,我不确定为什么会收到它以及如何解决它。我当前的代码是,并且错误发生在try块中:
public static String scrapeWebsite() throws IOException {
final WebClient webClient = new WebClient();
final HtmlPage page = webClient.getPage(s);
final HtmlForm form = page.getForms().get(0);
final HtmlSubmitInput button = form.getInputByValue(">");
final HtmlPage page2 = button.click();
try {
page2.wait(1);
}
catch(InterruptedException e)
{
System.out.println("error");
}
String originalHtml = page2.refresh().getWebResponse().getContentAsString();
return originalHtml;
}
}
答案 0 :(得分:6)
这是因为page2.wait(1);
你需要同步(锁定)page2
对象然后调用等待。也适合睡觉,最好使用sleep()
方法。
synchronized(page2){//page2 should not be null
page2.wait();//waiting for notify
}
上面的代码不会抛出IllegalMonitorStateException
异常。
请注意,与wait()
一样,notify()
和notifyAll()
需要在通知之前同步对象。
此link可能有助于解释。
答案 1 :(得分:1)
如果您尝试暂停一秒钟,Object.wait()
是错误的方法。您想要Thread.sleep()
。
try {
Thread.sleep(1); // Pause for 1 millisecond.
}
catch (InterruptedException e) {
}
sleep()
暂停指定时间间隔的当前线程。请注意,时间以毫秒为单位指定,因此1表示1毫秒。暂停1秒钟通过1000。
wait()
是一种与同步相关的方法,用于协调不同线程之间的活动。它需要从synchronized
块内部调用,与其他一些调用notify()
或notifyAll()
的线程一起调用。它应该不用于简单地为您的程序添加延迟。