3

我在我的代码中遇到了 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;
  }
}
4

2 回答 2

7

这是因为page2.wait(1); 您需要同步(锁定)page2对象然后调用等待。也为了睡觉最好使用sleep()方法。

synchronized(page2){//page2 should not be null
    page2.wait();//waiting for notify
}

上面的代码不会抛出IllegalMonitorStateException异常。
并注意like wait(),notify()并且notifyAll()需要在通知之前同步对象。

这个链接可能有助于解释。

于 2013-10-23T21:02:28.343 回答
2

如果你只是想暂停一秒钟,Object.wait()那是错误的方法。你想要Thread.sleep()

try {
    Thread.sleep(1);  // Pause for 1 millisecond.
}
catch (InterruptedException e) {
}
  • sleep()将当前线程暂停指定的时间间隔。请注意,时间以毫秒为单位指定,因此 1 表示 1 毫秒。暂停 1 秒通过 1000。

  • wait()是一种与同步相关的方法,用于协调不同线程之间的活动。它需要从synchronized块内部与其他一些线程调用notify()notifyAll(). 它应该用于简单地为您的程序添加延迟。

于 2013-10-23T21:06:39.007 回答