如何告诉Java运行这个Runtime.getRuntime()。exec,而不必等待它运行的命令,只需在后端运行它?

如何让Runtime.getRuntime().exec(p)运行而不用等待睡眠10? 目前它是错误的,它等待执行完成,然后移动到下一个。 我需要在飞行中让exec运行,以便10秒后它可以杀死PresentationInProjector.jpg。

Example: Runtime.getRuntime().exec("(sleep 10; echo '09|00|CC|01|83|88' | nc localhost 58888) &"); PlayThisSlideShow("PresentationInProjector.jpg"); 

根据文档exec()

在单独的进程中执行指定的字符串命令。

因此,除非在Runtime返回的进程上使用了waitFor() ,否则对exec()任何调用都不应该被阻塞。

这是一个小例子(省略了异常处理):

 Process p=Runtime.getRuntime().exec("cmd.exe /c ping 127.0.0.1 -n 10"); System.out.println("Here 1");//this will execute immediately try { p.waitFor(); System.out.println("Here 2");//this will only be seen after +- 10 seconds and process has finished } catch (InterruptedException ex) { ex.printStackTrace(); } 

exec()不会让线程等待,直到派生进程默认结束。 您需要显式调用process.waitFor()以使当前进程等待。 我猜PlayThisSlideShow("PresentationInProjector.jpg");exec()之后立即被调用。 你看到的是只要子进程正在运行,使得JVM进程运行的系统。 我想没有办法克服这个容易,让父进程在子进程仍在运行时被杀害。

为什么不能从Java中杀死演示投影仪?

   Runtime.getRuntime().exec("(sleep 10; echo '09|00|CC|01|83|88' | nc localhost 58888) &"); 

不会做你所期望的。 Runtime.exec不是shell,不能理解()分组, 或| 。 但是您尝试执行的操作可以纯粹用Java完成,您不需要执行外部进程。 例如(省略异常处理):

 new Thread(new Runnable() { public void run() { Thread.sleep(10000); //sleep 10 Socket s = new Socket("localhost", 58888); // nc PrintWriter pw = new PrintWriter(s.getOutputStream()); pw.print("09|00|CC|01|83|88\n"); // echo pw.close(); s.close(); } }).start();