2016-06-24 5 views
0

現在、私はjava ocajp 8の認証を準備しており、ダンプを調べているだけで、次のコードはIllegalStateExceptionをスローします。wait()、notify()を使用したIllegalStateException

とコードは、コードを先行

void waitForSignal() throws Exception{ 
    Object obj = new Object();  
    synchronized (Thread.currentThread()) { 
     obj.wait();  
     obj.notify();  
    }  
}`  

below`であることが提供するすべての何もない、なぜ例外が、ここで発生すると、実際には、私はマルチスレッドについて少し知っているんです。 およびjavaのドキュメントに従う

IllegalStateException:メソッドが不正または不適切な時間に呼び出されたことを通知します。言い換えれば、Java環境またはJavaアプリケーションは、要求された操作に適切な状態ではありません。

は、だから、私は右だ場合、なぜそれが違法の時間です...待ち時間()または通知()不適切なときに呼び出されるのと仮定し、私が間違っている場合は例外が発生する理由、そして...説明

+2

私はJavaでのマルチスレッドは、試行錯誤を経て学習できるものではないと恐れています。 (または少なくとも、多くの試行が必要です)この場合、問題はあなたが 'obj'のモニターを持っていないことです。 – biziclop

+2

スレッドオブジェクトの同期は非常に悪い考えです。 – biziclop

+1

@biziclopしたがって、オブジェクトにロックを設定しているときにwaitまたはnotifyを呼び出すことができますが、ここではスレッドオブジェクトをロックしています。そういうわけで、違法ステート例外の理由は何ですか?間違っている場合は私を修正してください – viru

答えて

2

現在のスレッドがそのオブジェクトのモニタを所有していない限り、オブジェクトに対してwait()を実行することはできません。これを行うには、あなたはそれに同期する必要があります:

synchronized (obj) { 

のjavadocによると:

パブリッククラスは、IllegalMonitorStateException はRuntimeExceptionが は、スレッドがオブジェクトのモニターで待機するようにまたは通知しようとしたことを示すためにスロー拡張します指定されたモニターを所有せずにオブジェクトのモニターで待機している他のスレッド。

関連する問題