14

通常のSwingアプリケーションは最初にEDTを開始し、最後のウィンドウが閉じられると、アプリケーションは基本的にSystem.exitで暗黙的または明示的に停止します。

しかし、私の小さなアプリケーションは、実際にはSwingについて何も知らないフレームワークのプラグインです。プラグインを呼び出すと、ユーザーから入力を取得して後で終了するためにダイアログが表示されますが、フレームワークは実行を継続する必要があります。だから私は呼び出すことができませんSystem.exit

しかし、そうしないと、EDTは引き続き実行され、フレームワークが終了すると、EDTは引き続き実行され、実行され、実行されます...

したがって、アプリケーションを強制終了せずにEDTを強制終了したいと思います。それ、どうやったら出来るの?

4

2 に答える 2

14

Oracle/Sun からの次のドキュメントは、この問題に光を当てています: AWT Threading Issues

[...]

1.4 より前では、ヘルパー スレッドは決して終了しませんでした。

1.4 以降、4030718 の修正の結果、動作が変更されました。現在の実装では、AWT はすべてのヘルパー スレッドを終了し、次の 3 つの条件が真の場合にアプリケーションを正常に終了できるようにします。

  • 表示可能な AWT または Swing コンポーネントはありません。
  • ネイティブ イベント キューにネイティブ イベントはありません。
  • Java EventQueues には AWT イベントはありません。

したがって、System.exit を呼び出さずにクリーンに終了したいスタンドアロンの AWT アプリケーションは、次のことを行う必要があります。

  • アプリケーションの終了時に、すべての AWT または Swing コンポーネントが非表示になっていることを確認してください。これは、すべてのトップレベル Windows で Window.dispose を呼び出すことで実行できます。Frame.getFrames を参照してください。...
  • アプリケーションによって AWT または Swing コンポーネントに登録された AWT イベントリスナーのメソッドが、無限ループに陥ったり、無期限にハングアップしたりしないようにしてください。たとえば、AWT イベントによってトリガーされる AWT リスナー メソッドは、同じタイプの新しい AWT イベントを EventQueue にポストできます。引数は、AWT イベント リスナーのメソッドは通常、ヘルパー スレッドで実行されるということです。

[...]

于 2011-01-28T21:56:40.270 に答える