当前位置: 首页 > 面试题库 >

Runtime.exec()。waitFor()不会等待过程完成

司徒阳曜
2023-03-14
问题内容

我有这个代码:

File file = new File(path + "\\RunFromCode.bat");
file.createNewFile();

PrintWriter writer = new PrintWriter(file, "UTF-8");
for (int i = 0; i <= MAX; i++) {
    writer.println("@cd " + i);
    writer.println(NATIVE SYSTEM COMMANDS);
    // more things
}

writer.close();

Process p = Runtime.getRuntime().exec("cmd /c start " + path + "\\RunFromCode.bat");
p.waitFor();

file.delete();

发生的是该文件在实际执行之前已删除。

这是因为.bat文件仅包含本机系统调用吗?执行文件 如何删除.bat?(我不知道.bat文件的输出是什么,因为它是动态变化的)。


问题答案:

通过使用start,您要求cmd.exe在后台启动批处理文件:

Process p = Runtime.getRuntime().exec("cmd /c start " + path + "\\RunFromCode.bat");

因此,您从Java(cmd.exe)启动的进程将在后台进程完成之前返回。

删除start命令以在前台运行批处理文件-然后,waitFor()将等待批处理文件完成:

Process p = Runtime.getRuntime().exec("cmd /c " + path + "\\RunFromCode.bat");

根据OP,重要的是要有可用的控制台窗口-这可以通过添加/wait参数来完成,如@Noofiz所建议。以下SSCCE为我工作:

public class Command {

public static void main(String[] args) throws java.io.IOException, InterruptedException {
       String path = "C:\\Users\\andreas";

       Process p = Runtime.getRuntime().exec("cmd /c start /wait " + path + "\\RunFromCode.bat");

       System.out.println("Waiting for batch file ...");
       p.waitFor();
       System.out.println("Batch file done.");
   }
}

如果RunFromCode.bat执行EXIT命令,命令窗口将自动关闭。否则,命令窗口将保持打开状态,直到您使用显式退出它EXIT为止-
Java进程一直在等待,直到在两种情况下都关闭了窗口。



 类似资料:
  • 问题内容: 我有一个代码,其中4个线程同时运行。我想等到所有这4个线程都结束。并且只有在那之后才能继续应用程序流程。 我尝试了两种方法: ,这种方法可以正常工作。之后的代码仅在所有线程完成后才执行。 ,此技术允许执行代码,即使并非所有线程都已完成,也可以执行代码。 代码示例: 我的问题: 为什么并且不要等到所有线程都完成并打印出来 _«我们完成了! 所有线程都完成了!» _刚打完电话? 问题答案:

  • 问题内容: 我有一个创建两个或多个子流程的主流程,我想让主流程等到所有子流程完成操作并退出吗? 问题答案: 一个对象有这个确切定义的方法:等待一个给定的子进程的完成(和,此外,对于重新调整它的退出状态)。 如果使用此方法,则可以防止进程僵尸闲逛太久。 (或者,您可以使用或来进行调用和等待。如果您不需要该进程的IO,那可能就足够了。但这可能不是一个选择,因为您的两个子进程似乎应该并行运行,而他们不会

  • 问题内容: 标题中已经存在的问题-如何使python脚本等到通过os.system()调用启动的某个过程完成?例如类似的代码 这将同时启动n次请求的进程,这可能会使我的PC有点汗水) 感谢您的任何建议。 问题答案: os.system() 确实 等待其过程完成后才返回。 如果您看到它不等待,则您正在启动的进程很可能会自行分离以在后台运行。在这种情况下,子进程。Popen+ wait示例Dor提供了

  • 问题内容: 因此,我有一些代码等待X发生,然后创建一个线程并执行processEmail。 我正在寻找的是一种代码,即使processEmail在另一个线程中发生,代码也可以继续等待X,但是当前代码只是等待线程完成,然后再等待X再次发生。 编辑:仅供参考,我什么都不需要在下面的代码中进一步输出processEmail.main(),因此不需要我等待其输出。 由Jean提供的答案:移除main之后的

  • 根据Espresso文档,检测测试应该自动等待完成。但它不起作用。我创建了这个简单的测试用例: 返回UI线程时测试应该失败,但它总是成功。这是测试的logcat输出: 正如您所看到的,测试在后台方法执行之前就已经完成了。我怎样才能让考试等待呢?

  • 我在blender中有一个python脚本 我试着用通勤,但还是没用: 此shell脚本在MacOS上非常有效(在更改路径后),并且在使用时会等待 但是在Windows上,我在Blender中运行下面的python脚本,然后一旦它到达子进程行就会打开并运行shell脚本,而Blender不等待它完成,它只在控制台中打印而不等待Git Bash完成。有人帮忙吗?