23

何年にもわたる Java プログラミングの後、私はいつも次のmain()ようなメソッドを作成していました。

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

しかし最近、Web からいくつかのコードを調べたところ、main()上記の通常の使用法ではなく、次のようなコードが時々見られました。

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

私は単に知りたい:

  • 通常のmain()方法ではなく、なぜこれを使用するのですか? 試してみると違いがわかりません。
  • これら2つの方法の違いは何ですか?

私とあなたの答えを読んでくれてありがとう。

4

4 に答える 4

22

ドキュメントはその理由を説明しています。最初のスレッドから

最初のスレッドが単純に GUI 自体を作成しないのはなぜですか? Swing コンポーネントを作成または操作するほとんどすべてのコードは、イベント ディスパッチ スレッドで実行する必要があるためです。

およびイベントディスパッチスレッドから

一部の Swing コンポーネント メソッドは、API 仕様で「スレッド セーフ」とラベル付けされています。これらは、どのスレッドからでも安全に呼び出すことができます。他のすべての Swing コンポーネント メソッドは、イベント ディスパッチ スレッドから呼び出す必要があります。このルールを無視するプログラムは、ほとんどの場合正しく機能しますが、再現が困難な予測不能なエラーが発生する可能性があります。

于 2013-03-08T20:00:03.207 に答える
13

VM によって開始されたスレッド「メイン」は、イベント ディスパッチ スレッドではないためです。

于 2013-03-08T20:08:57.317 に答える