8

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

Example:

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

3 回答 3

11

根据文档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(); 
}
于 2012-10-01T07:16:35.717 回答
5

exec()默认情况下,不会让线程等待生成的进程结束。您需要process.waitFor()显式调用以使当前进程等待。我想那PlayThisSlideShow("PresentationInProjector.jpg");是在之后立即调用的exec()。您所看到的是,只要子进程正在运行,系统就会使 JVM 进程运行。我想没有办法轻松克服这个问题,在子进程仍在运行时杀死父进程。

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

于 2012-10-01T07:25:31.877 回答
3
   Runtime.getRuntime().exec("(sleep 10; echo '09|00|CC|01|83|88' | nc localhost 58888) &");

不会做你所期望的。Runtime.exec不是外壳,不理解()分组;|. 但是您尝试执行的操作可以纯粹在 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();
于 2012-10-01T07:50:04.263 回答