2013-02-02 55 views
1

如何在程序退出時以編程方式強制關閉程序。 我已經添加了關閉掛鉤,它調用System.exit(0),但它似乎有執行該問題的問題。即使Jframe已關閉並執行了關閉掛鉤,javaw.exe進程仍會在內存中運行。爪哇力量關閉程序

此外,當我手動關閉運行該程序的批處理文件時,Windows將引發強制關閉消息。 image:http://i.imgur.com/gy57OEV.png

+1

使用堆棧跟蹤 –

+0

有似乎沒有叫任何例外添加例外..它只是不關閉。 另外,當我手動關閉批處理文件時,Windows提供強制關閉消息。 – Chris

回答

8

在關機掛鉤中調用System.exit()毫無意義。 JVM已經決定在鉤子被調用之前關閉。我想,從關閉掛鉤調用System.exit()可以有問題......

據推測,您的應用程序沒有關閉的原因是,您的應用程序創建了其他線程,他們都還活着。

解決此問題的一種方法是讓JFrame關閉事件(或關閉按鈕)觸發啓動JVM關閉的事件。您的f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)代碼是實現該目標的一種方法。它會調用System.exit ...並在JVM關閉時運行任何關閉鉤子。

另一種方法是將其他線程標記爲「守護程序」線程,這意味着它們不會阻止JVM決定關閉。 (正常情況下,JVM如果沒有活的非守護線程拉插頭。對於單線程應用程序,這意味着你的「主」線程...)


由於利益的問題,這裏的爲什麼System.exit()調用在關閉鉤子中存在問題。

的Javadoc說System.exit()相當於System.getRuntime().exit(),而對於後者的Javadoc這樣說:

如果調用該方法的虛擬機已經開始其關閉序列之後接着如果關閉掛鉤是如果調用內System.exit()關閉掛鉤正在運行該方法將無限期地阻塞。

所以,這足以引起鉤到b無限期地鎖定。這將導致關機順序停止。

+0

好吧,我添加了類似'f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);'我假設會調用關機掛鉤。但是,在關閉鉤子中需要什麼來實際關閉進程?它現在的方式只是給予力量關閉的信息。 – Chris

+0

Ooooohhh好吧,我明白你在說什麼,明白了。我從關閉掛鉤中刪除了'System.exit(0);',現在它正確關閉。 感謝您的幫助 – Chris

0

System.exit()正常工作在JOptionPane場景:

Object[] options={"YES","NO"}; 
int selection= JOptionPane.showOptionDialog(this, "Message input", "Title", 
     JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, 
     options[1]); 
if(selection==JOptionPane.YES_OPTION){ 
    reset(); 
} 
else if(selection==JOptionPane.NO_OPTION){ 
    System.exit(0); 
} 

但是,上述f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);的規定仍然存在於我的主要方法