2012-01-19 30 views
2

wait();(非静的メソッド)を静的コンテキストで実装する方法はありますか。たとえば、静的クラスで非静的メソッドを実装する方法は?

public static void getkeylist(List keylist){ 
    for (int i=0;i<keylist.size();i++){ 
     System.out.println(keylist.get(i)); 
     wait(1000); 
    } 
} 

「非静的メソッドwait(long)は静的コンテキストからは参照できません」というエラーが表示されます。

私の問題を解決するのを手伝ってください。前もって感謝します。

+2

「同期」しているものに対してのみ「待機」することができます。何を同期していますか? [javadoc](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait)に「IllegalMonitorStateExceptionをスローします。現在のスレッドがオブジェクトのモニタの所有者でない場合" –

答えて

4

。私はあなたがメソッド名の間で混乱していると思います。

+0

_大変ありがとうございます。私はThread.sleep(1000)を試してみましたが、InterruptedExceptionを投げる必要があります。おかげさまで – dmfrl

0

あなたのクラスを想定がfooを呼び出すで、あなたはFoo.class.wait(1000)を呼び出すことができ、または代わりに、あなたは、静的なオブジェクトを定義し、その上にwaitメソッドを呼び出すことができます。

private static final Object lock = new Object(); 
... 

lock.wait(); 
+2

'wait 'を呼び出すオブジェクトのモニターを保持する必要があるので、' synchronized(lock){... lock.wait();}が必要です。 } '。 'Class'オブジェクトをロックすることはお勧めできません。なぜなら、誰もあなたの知識なしにロックを取得し、デッドロックを招く可能性があるからです。 –

+0

@CameronSkinnerは間違いなくあなたとシンクブロックとロッククラスポイントを持っています。 –

0

非静的メソッドのクラスのオブジェクトを作成し、それを使用していました。

waitThread.sleep(1000);については本当にnotifyとともに、スレッド制御のために使用されている方法

..... 
Foo foo = new Foo(); 
foo.wait(); 
..... 
+0

これを行うと、スレッドは 'foo'を起こすことができないので、現在のスレッドは永遠に終了します –

関連する問題