我想创建一些进程,然后一个接一个地杀死(每次杀死之前等待2秒)。结果,应出现3个窗口,然后依次消失。问题是只有第一个进程被杀死。
public static void main(String[] args) {
try {
Process p1 = Runtime.getRuntime().exec("notepad.exe");
Process p2 = Runtime.getRuntime().exec("calc.exe");
Process p3 = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "start", "dir"});
Thread.sleep(2000);
// p1.waitFor(2, TimeUnit.SECONDS);
p1.destroy();
Thread.sleep(2000);
// p2.waitFor(2, TimeUnit.SECONDS);
p2.destroy();
Thread.sleep(2000);
// p3.waitFor(2, TimeUnit.SECONDS);
p3.destroy();
} catch (Exception ex) {
System.out.println("" + ex);
}
}
答案 0 :(得分:1)
如果使用 Java 9 ,则可以使用ProcessHandle和destroyForcibibly()方法,该方法与kill -9
几乎相同,但是由于 Java 8 您可以在destroyForcibly()
对象上使用Process
。
@编辑
这仅与calc.exe和cmd.exe有关,因此让我们看一下calc.exe
进程。
运行calc.exe
时,calc.exe
启动C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.1804.911.0_x64__8wekyb3d8bbwe
因此这些过程是不同的。Calc.exe
使用其他PID启动另一个过程。
该怎么办?
在 Java 9 上,您可以使用ProcessHandle
类来查找从该目录运行的进程,获取PID并终止:
我得到:
Optional[C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.1804.911.0_x64__8wekyb3d8bbwe\Calculator.exe]
要获取我们的进程,您可以在启动calc.exe之前获取进程的快照,并在运行calc.exe之后与该快照进行比较。但这不能100%保证您仅获得一个Calculator.exe。
就像这样,用户和您的应用同时启动calc.exe。因此,您得到两个Calc.exe
进程,一个由您启动,一个由应用程序启动。