1

終了時にプログラムを強制的に閉じるにはどうすればよいですか。a を呼び出すシャットダウン フックを追加しましたSystem.exit(0)が、実行に問題があるようです。Jframejavaw.exeが閉じられ、シャットダウン フックが実行されても、プロセスはメモリ内で実行され続けます。

さらに、プログラムを実行しているバッチ ファイルを手動で閉じると、Windows は強制終了メッセージをスローします。画像: http://i.imgur.com/gy57OEV.png

4

2 に答える 2

9

System.exit()シャットダウンフックを呼び出すのは無意味です。JVM は、フックが呼び出される前にシャットダウンすることを既に決定しています。System.exit()シャットダウンフックから呼び出すと問題が発生する可能性があると思います...

おそらく、アプリケーションが閉じない理由は、アプリケーションが他のスレッドを作成し、それらがまだ生きているためです。

これを処理する 1 つの方法は、JFrame の閉じるイベント (または [閉じる] ボタン) で、JVM のシャットダウンを開始する何かをトリガーすることです。あなたのf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)コードはそれを行う1つの方法です。それは System.exit ... を呼び出し、それは JVM がシャットダウンするときにシャットダウン フックを実行します。

もう 1 つの方法は、他のスレッドを「デーモン」スレッドとしてマークすることです。これは、JVM がシャットダウンを決定するのを停止しないことを意味します。(通常、ライブの非デーモン スレッドがない場合、JVM はプラグを抜きます。シングル スレッド アプリケーションの場合、それは「メイン」スレッドを意味します ...)


興味深いことに、シャットダウン フックで System.exit() 呼び出しが問題になる理由を次に示します。

javadoc はSystem.exit()と同等であると述べてSystem.getRuntime().exit()おり、後者の javadoc は次のように述べています。

"仮想マシンがシャットダウン シーケンスを開始した後にこのメソッドが呼び出された場合、シャットダウン フックが実行されている場合、このメソッドは無期限にブロックされます。 "

したがって、シャットダウン フックSystem.exit() で呼び出すと、フックが無期限にブロックされるのに十分です。これにより、シャットダウン シーケンスが停止します。

于 2013-02-02T03:57:56.640 に答える
0

System.exit()シナリオで適切に動作しJOptionPaneます:

Object[] options={"YES","NO"};
int selection= JOptionPane.showOptionDialog(this, "Message input", "Title",
        JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, 
        options[1]);
if(selection==JOptionPane.YES_OPTION){
    reset();
}
else if(selection==JOptionPane.NO_OPTION){
    System.exit(0);
}

しかし、上記のようf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);に、私のメインメソッドにはまだ存在しています

于 2014-04-21T19:29:03.687 に答える