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

时间:2012-10-01 07:07:56

标签: java linux swing

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

Example:

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

3 个答案:

答案 0 :(得分:9)

根据文档exec():

  

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

因此,除非您对exec()的已返回流程使用waitFor(),否则不应阻止对Runtime的任何调用。

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

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(); 
}

答案 1 :(得分:5)

exec()没有使线程等待,直到生成的进程默认结束。您需要明确调用process.waitFor()以使当前进程等待。 我想在PlayThisSlideShow("PresentationInProjector.jpg");之后立即调用exec()。您看到的是只要子进程正在运行,系统就会使JVM进程运行。我想没有办法轻易克服这个问题,让父进程在子进程仍在运行时被终止。

为什么你不能用Java杀死演示投影仪?

答案 2 :(得分:3)

   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();