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 が終了しないことが保証されています。