11

たとえば、アプリケーションをLinuxターミナルで実行していて、キーボードの「CTRL + C」を押してプロセスを強制終了すると、Javaプログラムが終了します。

Javaアプリケーションでこの「要求」をキャッチして、正常にシャットダウンし、すべてのリソース/書き込みログを解放できるようにする方法はありますか。応答に違いが生じる場合は、いくつかの異なるスレッドを実行しています。

addShutDownHookがあることは知っていますが、Javaのドキュメントに記載されているように、Linuxの「CTRL + C」からのkillシグナルなど、特定の状況では呼び出されません...他の方法はありますか?

Runtime.getRuntime().addShutdownHook(new Thread()
{
    public void run ()
    {
        // TODO: implement graceful shutdown here.
    }
});
4

2 に答える 2

3

免責事項はのためだけにあると思う kill -9ので、データの一貫性を維持するために呼び出されるシャットダウンフックに依存しないでください。

したがって、プロセスがOSによってシグナルに作用することを許可されている場合、シャットダウンフックが呼び出されます。これは、OSがどのように機能するかを知っていれば明らかですが、すべてのJava開発者にはわかりません。

実際には、 javadocで詳細に説明されています。

また、VMには複数のシャットダウンフックが登録されている可能性があるため、シャットダウンフックではなく、いくつかのうちの1つである可能性があることも覚えておく価値があります。

于 2011-05-17T10:38:56.767 に答える
2

これは私にとってはうまくいき、LinuxでSIGINT/Ctrl-Cをキャプチャします。

public class TestShutdownHook
{
    public static void main(final String[] args) throws InterruptedException
    {
        Runtime.getRuntime().addShutdownHook(new Thread()
        {
            @Override
            public void run()
            {
                System.out.println("Shutdown hook ran!");
            }
        });

        while (true)
        {
            Thread.sleep(1000);
        }
    }
}
于 2011-05-17T10:41:14.007 に答える