2011-04-20 79 views
1

我试图清理应用程序中的资源,然后关闭它,从我以前的问题(Detecting When A Java Application Closes)开始我已经实现了以下代码完美地执行清理操作。在调用System.exit(0)后应用程序继续运行 - Java

//Intercept when the application closes 
      Runtime.getRuntime().addShutdownHook(new Thread() 
      { 
       @Override 
       public void run() 
       { 
        //Reclaim resources from MIDI usage 
        if(_midiInstance.CleanUp()) 
        { 
         Logger.Add("Closed resources successfully on ShutDown"); 
        } 
        else 
        { 
         Logger.Add("Failed to close all resources on ShutDown"); 
        } 
        System.exit(0); 
       } 
      }); 

虽然System.exit(0);调用被理解和处理,应用程序继续运行,只是没有可见的GUI。我曾考虑过将System.exit(0)调用放在线程之外,但它超出了范围,没有任何其他线程或流正在运行。

当连接到ShutDown事件以确保一切关闭时,是否需要执行额外的步骤?

感谢您的时间,我非常感谢。

+0

应用程序中的所有线程是否正确处理被中断? – justkt 2011-04-20 18:56:33

+0

应用程序中没有其他线程,唯一的线程是钩入Shutdown事件时声明的线程。 – 2011-04-20 19:15:02

回答

3

看完您的其他问题后,您的窗口似乎不会拨打dispose()。如果属实,那将解释您的问题的原因。

+0

在调用System.exit(0)之前,我会调用Dispose()吗? – 2011-04-20 19:15:31

+0

你可以调用它而不是调用System.exit(0)。该应用程序将自然退出。 – JVerstry 2011-04-20 19:23:00

+0

@Jamie Keeling它解决了你的问题吗? – JVerstry 2011-04-20 20:44:26

1

您需要通过乘坐窗口关闭按钮:

  //overriding the windowClosing() method will allow the user to click the close button 
    addWindowListener(
      new WindowAdapter() 
    { 
     public void windowClosing(WindowEvent e) 
     { 
      System.exit(0); 
     } 
    }); 

通过这样的程序将关闭不只是变得不可见。

+0

是的,但如果在其他线程上执行工作,则这是一种苛刻的方法。它并没有给他们一个很好的清理机会。 – JVerstry 2011-04-20 19:24:57

+0

我同意dispose()是比System.exit(0)更好的选择;我真的指出了windowsClosing的覆盖 – Bit 2011-04-20 19:50:09

相关问题