如何让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");
答案 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();