title: Exiting an application gracefully?
body: <p>I have an application with a well defined Try/Catch/Finally chain that exits and executes the finally block just fine under normal conditions, however when someone prematurely hits the red X in the GUI, the program fully exists (code = 0) and the main thread's finally block isn't called.</p>
  
  <p>In fact, I do want the program to exit upon a click of the red-X, but what I do not want is a skipping of the finally{} block! I sort of put in the most important part of the finally block manually in the GUI but I really do not want to do it this way since I want the GUI decoupled from the actual program:</p>
  
  <pre><code>class GUI { // ...
  ...
  mainFrame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent evt) {
      try {
        processObject.getIndicatorFileStream().close();
      } catch (Exception ignore) {}
      System.exit(0);
    }
  });
  ...
  }
  </code></pre>
  
  <p>But I'd prefer to just have a call like this:</p>
  
  <pre><code>mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  </code></pre>
  
  <p>And make sure that all the finally{} blocks get called from each thread after the Exit.</p>
  
  <p>I know this is actually expected. If the application is closed from a separate thread (say the GUI thread) then the main thread will just stop in its tracks. </p>
  
  <p><strong>In short -- how do I ensure that a System.exit(0) or a JFrame.EXIT_ON_CLOSE will still cause each thread's finally block to execute?</strong> </p>