我从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代码阻止我的应用程序成功运行?
答案 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