2011-09-10 58 views
1

我創建了一個Java應用程序,其中main方法(程序的開始)啓動一個Process對象和一個創建JFrame的MainWindow類的對象。在Java應用程序中查殺進程的問題

public static void main(String[] args) throws Exception { 

File file = new File("./access/run.bat"); 
ProcessBuilder process_builder = new ProcessBuilder("cmd", "/c", file.getName()); 
process_builder.directory(file.getParentFile()); 
Process process = process_builder.start(); 
MainWindow window = new MainWindow(process); 

} 

我想終止已實例化與process.destroy()當窗口被關閉(殺死)的過程。下面是主窗口類的一些代碼:

public MainWindow(final Process process) throws TransformerException, ParserConfigurationException, Exception{ 

JFrame mainWindowFrame = new JFrame(); 

*****some code here*****   

mainWindowFrame.addWindowListener(new WindowListener() { 

public void windowClosed(WindowEvent arg0) { 

    process.destroy(); 
    System.exit(0); 
    } 

*****some code here*****  
    } 

} 

當窗口被關閉,不幸的是,這個過程沒有被殺...誰能給我這個解釋和可能的解決方案?謝謝!!!

回答

1

根據文檔here,只有在窗口被丟棄時才調用windowClosed。要做到這一點,你可以調用處置窗口上或設置默認關閉操作:在你的代碼,創建JFrame後,添加以下內容:

mainWindowFrame.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE); 

看你的代碼後,我建議你的工作方式不同: 在你的聽衆中,你正在銷燬這個過程然後退出。因此,你可以設置deafualt關閉操作退出,然後實施過程中
實施破壞的windowClosing方法:修改主窗口的代碼如下:

public MainWindow(final Process process) throws TransformerException, ParserConfigurationException, Exception{ 

JFrame mainWindowFrame = new JFrame(); 
mainWindowFrame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 

*****some code here*****   

mainWindowFrame.addWindowListener(new WindowListener() { 

public void windowClosing(WindowEvent arg0) { 

    process.destroy(); 

    } 

*****some code here*****  
    } 

} 
+0

感謝您的建議,但它不仍能正常工作,該進程仍在運行 – Anto

+0

我提到什麼會令該方法被調用,這樣的destroy()方法被擺在首位執行,因爲它不是之前運行。但似乎你的run.bat文件正在啓動其他進程,並且這些進程不會被你的進程的destroy()所銷燬。檢查下面的帖子[這裏](http://stackoverflow.com/questions/6356340/killing-a-process-using-java) –

0

的的Javadoc Process類這樣說:

The subprocess is not killed when there are no more references 
to the Process object, but rather the subprocess 
continues executing asynchronously. 

There is no requirement that a process represented 
by a Process object execute asynchronously or concurrently 
with respect to the Java process that owns the Process object. 

在互聯網上搜索後,它似乎是在自從Java 1.3 Java平臺的issue。我發現這個blog entry解釋了關於Java中Process的許多問題。

問題是在殺死應用程序後,process成爲孤兒。在您的代碼中,由於GUI(MainWindow類)具有其自己的線程,因此您正在從GUI中查找Process,因此它不是父代的Process。這是一個家長/孩子的問題。 有兩種方法糾正:

  1. 由於主線程是父進程,所以主線程必須調用destroy方法。所以你必須保留對process對象的引用。

  2. 第二種方法是在啓動MainWindow時創建該過程。在MainWindow類的參數中,可以傳遞進程的參數。因此,當調用windowClosed方法時,如果MainWindow關閉,Process將被銷燬,因爲後者是MainWindow的子項。

+0

這將取決於run.bat做什麼。如果其他進程由bat文件啓動,則不會被終止。 –