main
メソッドを呼び出します。仮想マシンは、次の 2 つのうちのいずれかが発生した場合にすべてのアクティビティーを終了し、仮想マシン自身を終了します。
Runtime
またはクラス System
の exit
メソッドを呼び出し、セキュリティーマネージャーによって exit 動作が許可された場合。
これは、アプリケーション自身がスレッドを開始しない場合、JVM は main
が終了するとただちに終了することを意味します。ただし、java.awt.Frame
を作成して表示する単純なアプリケーションの場合にはこれは当てはまりません。
public static void main(String[] args) { Frame frame = new Frame(); frame.setVisible(true); }その理由は、AWT が、AWT または Swing コンポーネントがトリガーできるイベントを処理するために、非同期イベントディスパッチ機構をカプセル化するからです。この機構の正確な動作は実装によって異なります。具体的には、内部的な目的で非デーモンのヘルパースレッドを開始できます。実際に、上記の例ではこれらのスレッドが終了を妨げています。この機構の動作に適用される制限は、次のもののみです。
EventQueue.isDispatchThread
は、呼び出し元スレッドがこの機構によって開始されたイベントディスパッチスレッドである場合にかぎり true
を返します。
EventQueue
(EventQueue
に送られたイベントは合体できる) に実際に入れられた AWTEvents
は次のようにディスパッチされます。
AWTEvent
A が AWTEvent
B よりも前に EventQueue
に入れられた場合、イベント B をイベント A よりも前にディスパッチすることはできません。
Component.isDisplayable
参照)。
Runtime
またはクラス System
の exit
メソッドを起動した場合、JVM は表示可能なコンポーネントが存在するかどうかにかかわらず終了します。
1.4 から、4030718 の修正の結果、この動作は変更されました。現在の実装では、次の 3 つの条件が満たされた場合、AWT はそのすべてのヘルパースレッドを終了し、アプリケーションが正常に終了できるようにします。
System.exit
を呼び出さずに正常に終了したいスタンドアローン AWT アプリケーションは、次を確認する必要があります。
Windows
で Window.dispose
を呼び出すことにより実行できます。Frame.getFrames
を参照してください。
EventQueue
に送信することがあります。問題は、AWT イベントリスナーのメソッドは通常ヘルパースレッドで実行されることです。
<...> Runnable r = new Runnable() { public void run() { Object o = new Object(); try { synchronized (o) { o.wait(); } } catch (InterruptedException ie) { } } }; Thread t = new Thread(r); t.setDaemon(false); t.start(); <...>「Java™ 仮想マシン仕様」では、このスレッドが終了するまで JVM が終了しないことが保証されています。