我有一个创建子进程的Java Swing应用程序。 Swing主应用程序具有一个停止按钮,单击该按钮后应立即终止子流程。 “ process.destroy()”无效。
Process myProcess = new ProcessBuilder("java", "-classpath", System.getProperty("java.class.path"), "MyClass.java");
try {
myProcess.waitFor();
}
catch (Exception e) {
e1.printStackTrace();
}
...
myStopButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myProcess.destroyForcibly();
// myProcess is a really long and complex process. So I could not destroy that using process.destroyForcibly().
}
}
答案 0 :(得分:1)
这真的取决于您的Java版本。
Java 8之前的版本
public abstract void destroy()
杀死子进程。此流程代表的子流程 对象被强制终止。
Java 8
public abstract void destroy()
杀死子进程。子流程是否以此为代表 过程对象是否被强制终止或不是实现 依赖。
public Process destroyForcibly()
杀死子进程。此流程代表的子流程 对象被强制终止。这个的默认实现 方法调用destroy(),因此可能不会强制终止 处理。此类的具体实现非常有力 鼓励通过兼容的实现重写此方法。 在由以下方法返回的Process对象上调用此方法 ProcessBuilder.start()和Runtime.exec(java.lang.String)将 强制终止该过程。
注意:子进程可能不会立即终止。即isAlive()可能 在调用destroyForcably()之后的短时间内返回true。这个 如果需要,可以将该方法链接到waitFor()。
返回:强制表示子流程的Process对象 毁了。
Java 9
public abstract void destroy()
终止进程。该流程是否代表该流程 对象通常终止还是不依赖于实现。 强制过程破坏被定义为立即终止 进程,而正常终止则允许进程关闭 干净地下来。如果该过程不存在,则不采取任何措施。的 当进程具有 终止。
public Process destroyForcibly()
强制终止该过程。此流程代表的流程 对象被强制终止。定义了强制过程销毁 作为过程的立即终止,而正常终止 允许进程完全关闭。如果这个过程还没有完成, 不采取任何行动。 onExit()中的CompletableFuture已完成 该过程终止时。
在由以下对象返回的Process对象上调用此方法 强制使用ProcessBuilder.start()和Runtime.exec(java.lang.String) 终止该过程。
API注意:
该过程可能不会立即终止。即isAlive()可能会返回 在调用destroyForcfully()之后的很短时间内为true。这个方法 如果需要,可以链接到waitFor()。实施要求: 此方法的默认实现会调用destroy(),因此可能 不强行终止该过程。实施说明:具体 强烈建议此类的实现重写此方法 符合标准的方法。
返回:
代表被强行破坏的进程的进程对象