允许Java以main()结束,而不关闭已执行()的进程

允许Java以main()结束,而不关闭已执行()的进程,java,Java,我正在使用Runtime.getRuntime().exec()启动一个进程 但是,一旦Java到达main()循环的末尾,Java就不会关闭,除非我先销毁()进程 问题是,我需要在Java关闭后继续运行该进程 我非常想这样做 public static void main(String args[]) { Runtime.getRuntime().exec("file.bat"); // now I want java to close, and I want file.bat to

我正在使用Runtime.getRuntime().exec()启动一个进程

但是,一旦Java到达main()循环的末尾,Java就不会关闭,除非我先销毁()进程

问题是,我需要在Java关闭后继续运行该进程

我非常想这样做

public static void main(String args[]) {
  Runtime.getRuntime().exec("file.bat");
  // now I want java to close, and I want file.bat to keep running
}
我尝试了System.exit(),它将停止我的main()循环,但是我认为由exec()启动的线程或其他东西会继续运行,从而阻止java关闭。如果不先退出file.bat,我甚至不能在Eclipse中结束它

为什么不关门?我该如何修复它

我在网上找不到任何东西,而且我已经试验了一段时间,所以我决定问问你们

谢谢,,
-Alex Benoit

仅针对Windows使用
cmd
启动文件

较旧的windows可能必须改用
command.com

Runtime.getRuntime().exec("cmd /c start file.bat");
使用start with
/wait
参数等待,直到bat在没有
/wait
的情况下完成,它应该可以工作

public class Command {

public static void main(String[] args) throws java.io.IOException, InterruptedException {
       String path = "C:\\DOCUME~1\\\USER\\DESKTOP";

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

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

@echo off
cls
:start
echo This is a loop
goto start
使用command.com文件获取短路径名,因为长路径名在
start
程序中处理得不太好

下面是我制作的下载链接示例:

您的问题可能是您没有Windows管理员帐户,您可以尝试,但这要求您键入管理员密码,这是非常愚蠢的

Process p = Runtime.getRuntime().exec("runas /profile /user:Administrator \"cmd.exe /c start test.bat\"");

这是一个依赖于系统的问题。我不确定在Windows中,父进程是否可以在子进程之前终止。我相信这在linux中是正确的

作为指导原则,您应该在流程上调用
waitFor()
。然而,在某些系统上,仅仅这样做可能是不够的。正如中所指出的,需要正确清除out/err流(使用
getOutputStream()
getErrorStream()
返回的流),因为它们会阻止进程完成。为此,我发现使用两个单独的线程最合适,一个清除err流,另一个清除out流。调用线程(在您的情况下为main)必须执行以下操作:

  • 启动外部流程
  • 启动线程以清除输出流
  • 启动线程以清除错误流
  • 在调用线程(main)上调用
    waitFor()

我发现上述方法非常健壮且易于实现(如果您熟悉线程的话)。请为线程使用执行器服务。

解决了这个问题。我将分享我的代码,以防其他人有同样的问题。我把它降到了1行

Desktop.getDesktop().open(new File("C:\\Folder\\File"));

我不认为你可以在打开某个文件后关闭java,一旦你关闭该文件,java就应该用它来关闭。@SSpoke是的,我担心可能是这样。我想我可能只需要创建两个文件,一个启动第一个文件,然后自然关闭它,这会起作用,但这似乎有点不专业,而且我不想为类似的东西创建另一个文件。我不是100%确定,但我想如果你杀死打开文件的java,它会用它关闭该文件。不确定。尝试在bat文件中创建一个循环,并在任务管理器中杀死java.exe,看看bat是否也关闭。我相信这是重复的:在链接中,Michael Minella发布了类似于
Runtime.getRuntime().exec(“cmd/c start editor.exe”)
可能会工作,因为它只会杀死cmd.exe,但是cmd.exe打开了editor.exe,而editor.exe不再连接到java或cmd.exe。对不起,请阅读我对评论的回复。我刚才回答。“出于某种原因,当你使用cmd时,它也有同样的效果,即使在主循环结束时cmd已经关闭,我甚至尝试过在之后销毁它。什么都没有。\”我现在已经测试过了,它工作得很好。。我将发布测试代码。我添加了一个示例下载链接,请尝试@SSpoke。你能创建一个要点或粘贴到其他地方吗?明白了!刚刚学习了桌面课程。Desktop.getDesktop().open(新文件(“filePathHere”);