在Java应用程序中使用ShutdowHook的好处是什么?

时间:2018-01-07 07:33:41

标签: java

我接触Shutdownhook并了解如何使用它 它允许注册{J}在JVM停止之前调用的ShutdownHook 我们可以在ShutdownHook中添加一些清理工作,例如删除临时文件等 好吧,它看起来像是一种优雅地关闭当前应用程序的方法 但是,我对使用它而不仅仅是在 Swing应用程序中的WindowCloseListener中添加清理操作感到困惑。

以下示例,

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ShutdownhookSample {
    public static void main(String args[]){
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(50, 50));
        panel.setBackground(Color.yellow);
        frame.add(panel);
        frame.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e){
                frame.dispose();
                System.out.println("Close from listener...");
                /**
                 * Add cleanup operations here
                 */
            }
        });
        frame.pack();
        frame.setVisible(true);

        Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void start(){
                System.out.println("Close from shutdownhook...");
                /**
                 * Add cleanup operations here
                 */
            }
        });

    }
}

无论我是通过退出按钮关闭应用程序还是通过"关闭窗口"在Windows任务栏中选项,将关闭监听器和ShutdownHook两个窗口。唯一的区别是ShutdownHook比Windows关闭监听器稍晚一点。是的,如果我强行关闭这个过程,就没有人被召唤。

所以这是我的问题:

是否真的需要在 Swing应用程序中使用ShutdownHook?似乎windows close侦听器足以处理清理操作。是否有任何情况不能被Windows关闭监听器覆盖,但ShutdownHook可以吗?

1 个答案:

答案 0 :(得分:1)

如果您需要这样做,则使用功能X.现有的特征X不足以使用它!

换句话说:当您创建非UI应用程序时,关闭挂钩会派上用场。或者当关闭主窗口时没有退出您的应用程序。想想一个在后台运行并且可以通过某个托盘栏图标复活的应用程序。