Java:为什么我的外部程序在Java中调用时会被冻结?

时间:2012-08-17 04:16:40

标签: java

我从Java GUI调用外部应用程序。当用户点击GUI中的“RUN”按钮时,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代码阻止我的应用程序成功运行?

1 个答案:

答案 0 :(得分:4)

我会猜测MyApp.bin正在输出符合标准的东西,而你却没有阅读它。这会导致缓冲区填满,并阻止您的进程。

Runtime.exec()会返回Process个对象。如果您阅读了javadoc,您会发现:

  

创建的子流程没有自己的终端或控制台。所有   它的标准io(即stdin,stdout,stderr)操作将是   通过三个流重定向到父进程   (getOutputStream(),getInputStream(),getErrorStream())。父母   进程使用这些流来输入和从中获取输出   子。因为某些本机平台仅提供有限的缓冲区   标准输入和输出流的大小,无法及时写入   输入流或读取子进程的输出流可能会导致   要阻止的子进程,甚至是死锁。

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