2015-12-22 12 views
5
public class Bees { 
    public static void main(String[] args) { 
     try { 
      new Bees().go(); 
     } catch (Exception e) { 
      System.out.println("thrown to main" + e); 
     } 
    } 

    synchronized void go() throws InterruptedException { 
     Thread t1 = new Thread(); 
     t1.start(); 
     System.out.print("1 "); 
     t1.wait(5000); 
     System.out.print("2 "); 
    } 
} 

出力は次のとおりです。例外()メソッド

1 thrown to main 

このthrown to mainがここに来た理由を私は得ていないのです。

+0

かもしれあなたはこれをチェックしている必要があります。http://stackoverflow.com/questions/1537116/illegalmonitorstateexception-on-wait-call – soorapadman

+0

あなたは '待機()'メソッドが何をするのか理解していますか? – Kayaman

+0

@Kayaman wait()メソッドについて考えてください。 –

答えて

5

wait()t1)を呼び出しているオブジェクトが同期ロックを所有していないため、java.lang.IllegalMonitorStateExceptionが表示されています。

メソッドを​​と宣言すると、そのメソッドのロック所有者が現在のオブジェクト(この場合はBeesのインスタンス)になります。あなたはt1wait()を呼び出したい場合は、t1で同期する必要があります。

... 
    Thread t1 = new Thread(); 
    synchronized(t1) { 
     t1.start(); 
     System.out.print("1 "); 
     t1.wait(5000); 
    } 
... 

サイドノートで例外をキャッチするとき、あなたは常に、少なくとも

のようなログ出力の例外自体を含める必要があります
... 
} catch (Exception e) { 
    System.out.println("thrown to main" + e); 
} 
... 

それ以外の場合は、など、実際に例外がスローされたなどの重要な情報が欠落する可能性があります。

はあなたが​​ブロックの内側からwaitを呼び出す必要がThe Java™ Tutorials: Synchronization.

+0

このエラーをどのように克服できますか? –

2

も参照してください。現在のスレッドは、待機する前にオブジェクトのモニタを取得する必要があります。現在のスレッドがこのオブジェクトのモニターを所有している必要があり

JavaDocからコピーされます。スレッドはこのモニターの所有権を解放し、別のスレッドがこのオブジェクトのモニターで待機しているスレッドに、notifyメソッドまたはnotifyAllメソッドの呼び出しのいずれかを起動するように通知するまで待機します。スレッドは、モニタの所有権を再度取得して実行を再開できるようになるまで待機します。

synchronized (obj) { 
    while (<condition does not hold>) 
     obj.wait(); 
    ... // Perform action appropriate to condition 
} 
関連する問題