2012-08-17 15 views
1

我從Java GUI調用外部應用程序。 Java的代碼如下當用戶點擊GUI中的「運行」按鈕:Java:爲什麼在Java中調用外部程序時會凍結?

Runtime runme = Runtime.getRuntime(); 
runme.exec("MyApp.bin"); 

MyApp.bin做一些數學計算,並在它的一些環路 - 沒什麼大不了的。發生什麼事是MyApp.bin卡住了!當我關閉我的Java GUI時,MyApp.bin繼續運行並結束。如果我直接從終端運行MyApp.bin,那麼它運行良好而不會凍結。爲什麼我的應用程序在從Java GUI運行時會凍結,但在關閉Java GUI時會恢復?什麼是Java GUI或Java代碼阻止我的應用程序成功運行?

回答

4

我打算大肆猜測MyApp.bin正在輸出某些東西給它的標準輸出,而你沒有閱讀它。這會導致緩衝區填滿並阻止您的進程。

Runtime.exec()返回Process對象。如果您閱讀了javadoc,您會發現:

創建的子流程沒有自己的終端或控制檯。所有 其標準io(即標準輸入,標準輸出,標準錯誤)操作將通過三個流 (getOutputStream(),getInputStream(),getErrorStream())重定向到父進程 。父進程 使用這些流向 子進程輸入並獲取輸出。由於某些本地平臺僅爲標準輸入和輸出流提供有限緩衝區大小 ,因此無法及時寫入 輸入流或讀取子流程的輸出流可能導致 子流程阻塞,甚至死鎖。

http://docs.oracle.com/javase/6/docs/api/java/lang/Process.html

+0

這聽起來像的問題!我的應用確實輸出了一些數字。看起來我需要查看getOutputStream(),根據您的鏈接。 – user785179 2012-08-17 04:23:20

+0

是的 - 即使你不打算做任何事情,你也需要閱讀輸出。在GUI應用程序中,您通常希望在自己的線程中執行所有這些操作,以免阻塞主事件處理線程。 – 2012-08-17 04:29:56

相關問題