终止java子进程的理想方法是什么?process.destroyForcibly()

我有一个创建子进程的 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().

    }

}

我可以向子进程发送一些信号以在内部调用 System.exit() 吗?

我可以使用“taskkill”来终止子进程吗?


元芳怎么了
浏览 2622回答 1
1回答

白衣染霜花

这真的取决于你的java版本。在 Java 8 之前public abstract void destroy()杀死子进程。该 Process 对象所代表的子进程被强制终止。爪哇 8public abstract void destroy()杀死子进程。此 Process 对象表示的子流程是否被强制终止取决于实现。public Process destroyForcibly()杀死子进程。该 Process 对象所代表的子进程被强制终止。此方法的默认实现调用 destroy() ,因此可能不会强制终止进程。强烈鼓励此类的具体实现使用兼容实现覆盖此方法。在 ProcessBuilder.start() 和 Runtime.exec(java.lang.String) 返回的 Process 对象上调用此方法将强制终止进程。注意:子进程可能不会立即终止。即 isAlive() 可能会在调用 destroyForcibly() 后的短时间内返回 true。如果需要,可以将此方法链接到 waitFor()。返回: 代表要强制销毁的子进程的 Process 对象。爪哇 9public abstract void destroy()杀死进程。此 Process 对象表示的进程是否正常终止取决于实现。强制进程销毁被定义为立即终止进程,而正常终止允许进程干净地关闭。如果进程不活动,则不采取任何行动。当进程终止时,来自 onExit() 的 CompletableFuture 完成。public Process destroyForcibly()强行杀死进程。该 Process 对象所代表的进程被强制终止。强制进程销毁被定义为立即终止进程,而正常终止允许进程干净地关闭。如果进程不活动,则不采取任何行动。当进程终止时,来自 onExit() 的 CompletableFuture 完成。在 ProcessBuilder.start() 和 Runtime.exec(java.lang.String) 返回的 Process 对象上调用此方法会强制终止进程。API注意事项:该过程可能不会立即终止。即 isAlive() 可能会在调用 destroyForcibly() 后的短时间内返回 true。如果需要,可以将此方法链接到 waitFor()。实现要求:该方法的默认实现调用destroy(),因此不能强行终止进程。实现注意:强烈鼓励此类的具体实现使用兼容实现覆盖此方法。返回:代表进程被强行销毁的 Process 对象
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java