0
void waitForSignal(){
    Object ob =new Object();

    synchronized (Thred.currentThread()) {
        try {
            ob.wait();
            ob.notify();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

このメソッドは IllegalMonitorStateException をスローします。誰かがその理由を説明できますか。

前もって感謝します

4

3 に答える 3

4

waitロックを取得したオブジェクトに対してのみ呼び出す必要があります。

あなたのコードでは、ロック on を取得しましたが、Thread.currentThread()それを on で呼び出しているためob、 がスローされIllegalMonitorStateExceptionます。

したがって、同期ブロックを次のように変更する必要があります。

synchronized (ob) {

}
于 2012-11-27T19:24:21.940 に答える
1

待機中のオブジェクトを同期したい場合:

synchronized (ob) {
        try {
            ob.wait();
            ob.notify();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
于 2012-11-27T19:28:21.173 に答える
0

IllegalMonitorException のような問題を修正したとしても

void waitForSignal() {
    Object ob = new Object();
    synchronized (ob) {

あなたのコードは機能しません。コードでは、各スレッドが新しいロックを作成し、メソッドの外では見えません。他のスレッドが待機中のスレッドに通知する機会はありません。

于 2012-11-27T20:56:17.880 に答える