15
java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        new NewJFrame().setVisible(true);
    }
});

上記のコードが実際に何をするのか教えてください。行ごとの説明を探しています。特に最初の行で、なぜそれを使用するのか、どのシナリオでこれを使用する必要があるのか​​を教えてください。

4

5 に答える 5

28

この例では、Runnableから派生した任意のクラスが表示されます。この匿名クラスは、実行可能なインターフェイスのrunメソッドをオーバーライドします。次に、この匿名クラスがインスタンス化され、静的メソッドであるEventQueue.invokeLaterメソッドに渡されます。このメソッドは、オブジェクトを...まあ...eventQueueに追加します。EvenQueueには、キーボードイベントやマウスイベントなどの多くのイベントがあります。このキューからデータを継続的にポーリングするスレッドがあります。そのスレッドがここでインスタンス化された匿名クラスに到達すると、run()メソッドを実行します。これにより、クラスNewJFrameのオブジェクトがインスタンス化され、表示されるように設定されます。

これを複雑にすることの全体的なポイントは、新しいJFrame()。setVisible(true)部分がメインスレッドではなく、イベントディスパッチスレッドで実行されることです。Swingでは、イベントディスパッチスレッドのユーザーインターフェイスを変更するすべてのコードを実行する必要があります。

于 2011-02-05T18:50:41.987 に答える
2

これは、後で実行するように指示されたコードのブロックです(遅延と呼ばれることもあります)。内部クラス(new Runnable() {...})は、基本的に、実行されるコードのブロックを渡すことを可能にします。このinvokeLaterメソッドは、コードのブロックが実行されることを保証しますが、いつ実行されるかは保証しません。特定のコードをすぐに実行するのは安全ではない場合があり、冗長すぎてマルチスレッドを自分で実行することはできません。そのため、Javaは、コードを安全に実行するためのこのユーティリティメソッドを提供します。コードはすぐに実行されますが、安全に実行できるようになるまで実行されません。

于 2011-02-05T18:52:55.403 に答える
1

ソース

invokeLater() メソッドは、Runnable オブジェクトをパラメーターとして受け取ります。このオブジェクトは、run() メソッドを実行するイベント ディスパッチ スレッドに送信されます。これが、run() メソッドが Swing コードを実行するのに常に安全である理由です。

-IvarD

于 2011-05-03T10:09:51.900 に答える
1

このinvokeLater呼び出しは、指定されたランナブルを後で処理するためにキューに入れます。つまり、メソッド呼び出しが戻っrun()たときに、メソッド内のコードはまだ実行されていません。invokeLater

このタイプのコードには、2 つの典型的な使用例があります。

  1. 現在実行中のコードは、バックグラウンド スレッドで実行されます。バックグラウンド スレッドは、swing API のほとんどにアクセスできません。この理由については、こちらをお読みください。現在のスレッドが既に UI スレッドである場合、理由はなく、呼び出しを安全に削除できます。
  2. 現在のブロックを終了する必要があります。つまり、コードは最後の中括弧に到達します。これにより、リソースが解放される可能性があります。これはあまり一般的ではありません。

匿名クラスがパラメーターとしてinvokeLater呼び出しに渡されます。このコードと同じです。

private void foo()
{
  java.awt.EventQueue.invokeLater(new JFrameCreator());
}
private class JFrameCreator implements Runnable
{
  public void run() {
    new NewJFrame().setVisible(true);
  }
}
于 2011-02-05T18:58:20.977 に答える