在我调用 r.exec 以启动 cmd 提示符后如何停止执行我的 java 程序
Posted
技术标签:
【中文标题】在我调用 r.exec 以启动 cmd 提示符后如何停止执行我的 java 程序【英文标题】:How to stop the execution of my java program after i invoke r.exec to start a cmd prompt 【发布时间】:2017-10-22 12:42:18 【问题描述】:在我正在使用的程序中 r.exec(); 启动命令提示符并在其中执行一个 bat 文件。
但是发生的情况是,只要执行了上面的语句,cmd提示符就会启动并执行其中的bat文件。但是,java程序执行不会等到bat文件在提示符中执行。 它启动 cmd 提示符并开始执行其中的 bat 文件,并在 r.exec(); 之后继续执行下一条语句。(同时我的 bat 文件仍在提示符中执行)
我的要求是,java程序必须等到命令提示符中的bat文件执行完毕,而不是继续执行下一条语句。
【问题讨论】:
你的意思是Runtime.exec()
?如果是这样,则返回一个Process
,您可以等待它完成。如果不是,请澄清r
是什么。
是的,它的 Runtime.exec()。但是我怎么能等到执行完呢?
另请参阅When Runtime.exec() won't,了解有关正确创建和处理流程的许多好技巧。然后忽略它引用exec
并使用ProcessBuilder
来创建进程。还将String arg
拆分为String[] args
以解决包含空格字符的路径之类的问题。
【参考方案1】:
Runtime.exec
返回一个Process
实例。在该实例上,您可以调用 waitFor()
等待进程完成。
此外,您需要处理Process.getErrorStream()
和Process.getOutputStream()
(通常在单独的线程中),这样当这些缓冲区填满时进程不会阻塞。 ProcessBuilder
和 redirectErrorStream(true)
有一个方便的方法,无需同时处理两个流,然后处理额外的线程。
【讨论】:
【参考方案2】:r.exec("command")
返回Process
。从这里您可以简单地输入以下内容:
Process process = r.exec("command here");
process.waitFor(); //Waits until process closes
waitFor()
方法将暂停当前线程,直到进程关闭。
Javadoc
waitFor()
:必要时使当前线程等待,直到此 Process 对象表示的进程终止
此外,如果您想捕获输入或向控制台发送命令,您可以在单独的线程中使用process.getInputStream()
和process.getOutputStream()
。这将使您可以在批处理文件运行时对其进行监控,因此如果由于某种原因发生故障,您可以取消终止进程。
【讨论】:
以上是关于在我调用 r.exec 以启动 cmd 提示符后如何停止执行我的 java 程序的主要内容,如果未能解决你的问题,请参考以下文章