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上記のコードは例外 をスローしません。そして、通知する前にオブジェクトを同期する必要があることに
注意してください。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 に答える