java关闭钩子不工作?

java关闭钩子不工作?,java,swing,Java,Swing,我开发了测量带宽流量的JavaSwing应用程序 但我希望当pc关闭时,应用程序能保存全部发送和接收 流量文件。 当我在代码中使用shutdownhook并关闭电脑时 文件无法保存! 有人能帮我吗` 我在win7_64上使用java public static void main(String[] args) throws AWTException, IOException, URISyntaxException, Exception { NewClass n=NewC

我开发了测量带宽流量的JavaSwing应用程序 但我希望当pc关闭时,应用程序能保存全部发送和接收 流量文件。 当我在代码中使用shutdownhook并关闭电脑时 文件无法保存! 有人能帮我吗` 我在win7_64上使用java

    public static void main(String[] args) throws AWTException, IOException, URISyntaxException, Exception {

        NewClass n=NewClass.getInstance();
       Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        public void run() {
            try {
                    saveHistory();//save send and recive traffic to file
                    System.out.println(1);

            } catch (IOException ex) {
                Logger.getLogger(BandWidthMeter.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }, "Shutdown-thread"));
   }    
}

     void saveHistory() throws IOException{
         Date date=new Date();
         SimpleDateFormat format=new SimpleDateFormat("yyyy/MM/dd hh:mm");
         String format1 = format.format(date);
         //convert traffic to kiloByte
         double session_Send=(double)send/1024;
          double session_Recive=(double)recive/1024;
         String row=format1+"-"+String.valueOf(session_Send)+"-"+String.valueOf(session_Recive);
        try (FileWriter fw = new FileWriter(new File("src/bandwidthmeter/history.txt"),true)) {
            fw.append(row);
            fw.append("\n");
        }
        try ( //update total.properties
                FileOutputStream out = new FileOutputStream("src/bandwidthmeter/total.properties")) {
            //convert traffic to megabyte
            double sessionSend=(double)send/1048576;
            double sessionRecive=(double)recive/1048576;
            totalSend+=sessionSend;
            totalRecive+=sessionRecive;
            prop.setProperty("totalSend",String.valueOf(totalSend));
            prop.setProperty("totalRecive",String.valueOf(totalRecive));
            prop.store(out,null);
            out.close();
        }
     }

shutdown钩子不是用于关闭PC,而是用于关闭JVM。只有在JVM“正常”关闭时,它才会工作。在POSIX上运行的JVM上,通过调用
System.exit()
或通过向其发送
SIGTERM
SIGINT
信号(Ctrl+C)来启动正常关机。根据操作系统的不同,可能是在关闭操作系统期间,JVM根本没有关闭,或者使用
SIGKILL
信号关闭。在这些情况下,将不会执行关闭挂钩。

您正在使用的IDE。请告诉我您是如何测试代码的。IDE内部还是外部IDE?在旁注中,您的代码格式不好,设计不好(Singleton
NewClass.getInstance()
,名称不好,无法传达像
NewClass
这样的意图,还有一个小故障,
Out.close()
调用在最后一次
try
中是多余的。另外,在
main()上
throws*Exception与
throws Exception
@shinedbasheer是多余的。为什么?IDE与它有什么关系?netbean IDE-在IDE中不工作IDE内部IDE很难正常关机在关机前保存文件吗?我不知道有没有一种独立于平台的方法。可能有人已经为Java实现了一个跨平台库(必须使用JNI),但我不知道。