2

だから私は数え切れないほどの異なる GUI チュートリアルを見てきましたが、それらはすべてこのコードを使用すると述べています。

   public static void main(String[] args) {
     javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });

}

そして、これが正確に何をするのかよくわからないかもしれませんが、私はGUIに少し慣れていないので、それが何をするのかの基本を理解しています...またはそう思った. しかし、それから私は、実験として、それをすべて切り取って、ただ残しました:

   public static void main(String[] args) {
     createAndShowGUI(); 
   }

そして、それはうまくいくように見えました。ここで質問があります。2 番目のコードが問題なく機能しているように見えたときに、2 番目のコードを使用するのではなく、最初のコードを保持する目的は何ですか? 必要な場合、使用しないとどうなりますか?

4

1 に答える 1

4

要するに、はい、Swing オブジェクトを変更するたびに必要です (API がスレッドセーフであると述べている場合を除きます)。

Swing オブジェクトはスレッド セーフではないため、GUI に加えた変更はすべてイベント ディスパッチ スレッド (EDT) で行う必要があります。イベントディスパッチスレッドチュートリアルから

Swing イベント処理コードは、イベント ディスパッチ スレッドと呼ばれる特別なスレッドで実行されます。Swing メソッドを呼び出すほとんどのコードも、このスレッドで実行されます。これが必要なのは、ほとんどの Swing オブジェクト メソッドが「スレッド セーフ」ではないためです。複数のスレッドからメソッドを呼び出すと、スレッドの干渉やメモリの一貫性エラーが発生するリスクがあります。一部の Swing コンポーネント メソッドは、API 仕様で「スレッド セーフ」とラベル付けされています。これらは、どのスレッドからでも安全に呼び出すことができます。他のすべての Swing コンポーネント メソッドは、イベント ディスパッチ スレッドから呼び出す必要があります。この規則を無視するプログラムは、ほとんどの場合正しく機能する可能性がありますが、再現が困難な予測不能なエラーが発生する可能性があります。

SwingUtilities.invokeLater を呼び出すと、実行可能なコード int が EDT で呼び出され、奇妙なエラーが発生しないことが保証されます。そのため、そのコードを削除すると、すべてが機能しているように見えます。テストした状況では、おそらく機能していたからです。しかし、常にそうであるとは限らず、時々動作するコードやタイミングの問題があるコードは必要ありません。

于 2014-10-02T21:44:30.547 に答える