2011-08-07 30 views
0

私はJavaでスレッドを初めて使用しています。ここで何が無限ループを引き起こしているのか、どのように解決できるのか教えてください。私は問題は、私がスレッドと一緒にGUIを使用しているという事実によって引き起こされていると思います。並列無限ループ

何が起こるかは、GUIの無限コピーがポップアップすることです。

public static void main(String[] args) { 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
       new RollplayGUI(); 
     } 
    }); 
} 

public RollplayGUI() { 
    createGUI(); 
    RollplayGUI rg = new RollplayGUI(); 
    Thread trg = new Thread(rg); 
    trg.setDaemon(true); 
    trg.run(); 
} 

public void run() { 
     //Some fun stuff my daemon thread is supposed to do 
    } 

私がこれをやっている理由は、run()メソッドが別のプログラムから接続を得るまでブロックするネットコードを実行するからです。

+0

下記のコメントがありますか?あなたが最後にどのように判明したのか、そして解決策を見つけたのかについて、いくつかのフィードバックを提供する必要があります。 –

答えて

7

RollplayGUIコンストラクタが新しいRollplayGUIオブジェクトをインスタンス化しているため、コードが失敗しています。これは、無限ループとなる可能性があります...スタックオーバーフロー。

+0

誰かの最初のSOの質問については、私の顔に笑顔。 – dlev

0

RollbackGUI()で新しいRollbackGUI()を作成するため、これは無限ループです。この行を削除してください:

RollplayGUI rg = new RollplayGUI(); 
0

ジャスティンは言ったことがありますが、一度修正すると決してスレッドを開始することはありません。スレッドオブジェクト(スレッドが開始されたときにそのスレッドを表す)を作成してから、元のスレッドでrun()メソッドを実行するだけです。実際にスレッドを起動するには、trg.run()の代わりにtrg.start()を使用します。

0

最初にRollplayGUIを作成すると、コンストラクターが呼び出されます。そのコンストラクタ内で新しいRollplayGUIを作成します。そのコンストラクタは再びRollplayGUIを呼び出します。これは無期限に発生します。これは無限ループです。

ラインは、GUIの無限の数は、あなたが各RollplayGUIは、それがインスタンス化された直後に新しいRollplayGUIを作成しなければならないことです取得

RollplayGUI rg = new RollplayGUI(); 
2

一つの理由です。

さらに、Threadオブジェクトに対してstart()を呼び出す必要があります。 runを呼び出すと、スレッド化していないかのようになります。 start()はスレッドを正しく処理します。