2011-09-10 18 views
1

メインメソッド(プログラムの開始)がProcessオブジェクトとJFrameを作成するMainWindowクラスのオブジェクトを開始するJavaアプリケーションを作成しました。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); 

} 

Iは(殺す)ウィンドウが閉じられたときに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

を実行していること(破壊するように、メソッドが呼び出されるようになります)、それはなかったとして、最初の場所で実行されます前に走っていた。あなたのrun.batファイルが他のプロセスを開始しているようで、プロセス上のdestroy()によって破壊されることはありません。以下の投稿を確認してください。[here](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クラス)が独自のスレッドを持ち、Process親ではないため、ProcessをGUIから削除しています。それは親子問題です。 それを修正する方法は2つあります。

  1. メインスレッドは、親プロセスであるので、メインスレッドがdestroyメソッドを呼び出す必要がありますので。したがって、processオブジェクトへの参照を保持する必要があります。

  2. 第2の方法は、MainWindowを起動しながらプロセスを作成することです。 MainWindowクラスの引数では、プロセスの引数を渡すことができます。したがって、windowClosedメソッドが呼び出されると、MainWindowが閉じられている場合、Processは、後者がMainWindowの子であるため破棄されます。提案のための

+0

これはrun.batの機能によって異なります。他のプロセスがbatファイルによって開始された場合、それらは終了しません。 –

関連する問題