1

我正在从我的 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 代码是什么?

4

1 回答 1

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

于 2012-08-17T04:20:31.907 回答