我接触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可以吗?
答案 0 :(得分:1)
如果您需要这样做,则使用功能X.现有的特征X不足以使用它!
换句话说:当您创建非UI应用程序时,关闭挂钩会派上用场。或者当关闭主窗口时没有退出您的应用程序。想想一个在后台运行并且可以通过某个托盘栏图标复活的应用程序。