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(tm)仮想マシン仕様」では、このスレッドが終了するまでJVMが終了しないことが保証されています。