2011-01-13 7 views
2

コンストラクタでwait()メソッドを使用できますか? 私はいくつかの他の初期化メソッドを呼び出し、guiのメソッドの後にコンストラクタメソッドを持っています。しかし、それは最初のメソッドの前にguiを読み込むことを縫う。したがって、初期化されていないオブジェクトにエラーが発生します。 guiの呼び出しの前にwait()を使用しようとしましたが、同期ブロックにないのでIllegalMonitorStateExceptionエラーがあります。そのようSTHをやろうとしコンストラクタでwait()メソッドを使用できますか? Java

dice = new Dice(); 
this.generateBoard(); 
this.generateCells(); 

this.wait(200,100); //otherwise?? 
//GUI 
board = new GUI(this); 
+1

BTW:wait(200,100)を使用するのはwait(200)と同じです。待ち(m、n)はかなり無意味なIMHOです。 –

+0

ええ、あなたは正しいですか?ピーター、私はちょうどそれをテストしました。ノートのためのthnx – FILIaS

+0

どのようなGUI APIをマルチスレッドにしようとしていますか?あなたは 'スレッドを意味しますか?「待つ」よりむしろ「眠る」? –

答えて

4

さて、あなたコンストラクタ内waitを使用することができます - あなただけの "この" コンストラクタ内で同期する必要があると思います:

// I'm not actually recommending this... 
synchronized (this) { 
    this.wait(...); 
} 

しかし、あなたがコンストラクタで "this"を他のスレッドで使っていたものに漏えいしていない限り、notifyが参照するものは明確ではありません。

正直言ってこれがどうやって失敗しているのかはっきりしていませんが、コンストラクタの最後に "this"が漏れていると思われます。初期化メソッドは余分なスレッドを開始して作業を行いますか? 正確にあなたがそれを修正しようとする前に何が起こっているのかを知る必要があります - そして、しばらくの間中断するのは私にとっては悪い考えです。

+0

おそらく、 'pulse'ではなく' notify'を意味しています - 質問にはJavaというタグが付いています。 –

+0

@Cameron:固定、ありがとう。指の滑り。 –

+0

何を見つけようとしていますが、最初の視界からは、オブジェクトがguiの前に初期化されているように見えました。だから私はそれを見てみるために一時停止しようとした。 – FILIaS

6

ご指摘のとおり、wait()は​​ブロック内に電話する必要があります。デフォルトで同期すると、thisにロックされ、オブジェクトが完全に構築される前に実際に公開されます。非常に悪いアイデア。 (何の意味をするwait()ためには、明示的thisとは異なるオブジェクトのロックなかった場合でも、あなたはまだ別のスレッドに早まっthisを公開するために必要なそれ以外の可能性があり、これまでnotify()それ -

しかし - @ジョンが指摘したように?)。だからこのスキームは匂いがする。

より良い代替手段が完全にオブジェクトを構築するために、静的なファクトリメソッドを使用しているだろう、そしては、それを安全に公開する:コンストラクタが唯一の方法は、新規に作成することを保証するためにprivate宣言されていること

class MyClass { 
    private MyClass() { 
    ... 
    } 
    public static MyClass createAndPublish() { 
    MyClass theInstance = new MyClass(); 
    // here you can already synchronize on theInstance, call wait() etc. 
    return theInstance; 
    } 
} 

お知らせインスタンスはcreateAndPublish()経由です:

MyClass newInstance = MyClass.createAndPublish(); 
+0

static factoryメソッド?それをもう少し詳しく説明することができます。私はこれまで聞いたことがない。私はJavaで新しいです。 – FILIaS

+0

@FILIaS、ちょうどサンプルコードが追加されました:-) –

+0

+1早産の危険があります。 – Raedwald

1

我々はコンストラクタで待機()メソッドを使用することはできますか?

他の人も指摘しているとおりです。

しかし、コンストラクタコードを2つの部分に分割することができます。 GUIがコンストラクタで作成される前に安全に実行できる部分を実行します。 initialize()メソッドでGUIが作成されるのを待たなければならない部分は、GUIの作成後に呼び出すことができます。

+0

"初期化()メソッドでGUIを作成するのを待たなければならない部分は、GUI作成後に呼び出すことができます" ... GUIの作成後なぜ? – FILIaS

関連する問題