Java:为什么在Java中调用正在运行的外部程序时会冻结?

Java:为什么在Java中调用正在运行的外部程序时会冻结?,java,Java,我正在从Java GUI调用外部应用程序。当用户点击GUI中的“运行”按钮时,Java代码如下所示: Runtime runme = Runtime.getRuntime(); runme.exec("MyApp.bin"); MyApp.bin做了一些数学计算,里面有一些循环——没什么大不了的。结果是MyApp.bin被卡住了!当我关闭Java GUI时,MyApp.bin继续运行并完成。如果我直接从终端运行MyApp.bin,那么它运行良好,不会冻结。为什么我的应用程序在从Java GUI

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

我想大胆猜测一下,
MyApp.bin
正在将一些东西输出到它的标准输出,而您没有阅读它。这会导致缓冲区填满,并阻止进程

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

创建的子流程没有自己的终端或控制台。全部的 其标准io(即stdin、stdout、stderr)操作将 通过三个流重定向到父进程 (getOutputStream()、getInputStream()、getErrorStream()。父母 进程使用这些流将输入馈送到 子流程。因为一些本机平台只提供有限的缓冲区 标准输入和输出流的大小,未能及时写入 子流程的输入流或读取输出流可能导致 子进程要阻塞,甚至死锁


我想大胆猜测一下,
MyApp.bin
正在将一些东西输出到它的标准输出,而您没有读取它。这会导致缓冲区填满,并阻止进程

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

创建的子流程没有自己的终端或控制台。全部的 其标准io(即stdin、stdout、stderr)操作将 通过三个流重定向到父进程 (getOutputStream()、getInputStream()、getErrorStream()。父母 进程使用这些流将输入馈送到 子流程。因为一些本机平台只提供有限的缓冲区 标准输入和输出流的大小,未能及时写入 子流程的输入流或读取输出流可能导致 子进程要阻塞,甚至死锁


这听起来像是个问题!我的应用程序确实输出了一些数字。看起来我需要根据你的链接查看getOutputStream()。是的-你需要读取输出,即使你不打算对它做任何事情。在GUI应用程序中,您通常希望在自己的线程中执行所有这些操作,以避免阻塞主事件处理线程。这听起来像是个问题!我的应用程序确实输出了一些数字。看起来我需要根据你的链接查看getOutputStream()。是的-你需要读取输出,即使你不打算对它做任何事情。在GUI应用程序中,您通常希望在自己的线程中执行所有这些操作,以免阻塞主事件处理线程。