gpt4 book ai didi

java - 如何清理由 Runtime.exec() 启动的进程?

转载 作者:可可西里 更新时间:2023-11-01 14:35:59 25 4
gpt4 key购买 nike

当我的 Java 程序异常停止时,由 Runtime.exec() 启动的应用程序不会停止。如何停止这些应用程序?

Process process = null;
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable()
{
public void run() {
process.destroy();
}
}));

try
{
process = Runtime.getRuntime().exec("win.exe");
process.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
process.destroy();
}

最佳答案

addShutdownHook 不会在强制关闭 Java 时执行,例如:

  • 从任务管理器中终止
  • 通过 Eclipse 停止按钮终止
  • 在 Linux 上 kill -9。

它确实在使用时执行

  • Ctrl+c
  • 其他用户发起的中断,例如 Windows 关闭。
  • 在 Linux 上杀掉

您可以通过将 Java 文件编译成类文件,然后在命令行上运行来对此进行测试。在命令行运行后,可以按Ctrl+c观察shutdown钩子(Hook)是否被执行。

要进行测试,请如下所示创建 RunTimeTest.java,然后使用您的 JDK 进行编译。

例如:

"c:\Program Files\Java\jdk1.7.0_40\bin"\javac RunTimeTest.java
"c:\Program Files\Java\jdk1.7.0_40\bin"\java RunTimeTest

测试代码:

import java.io.IOException;
import java.util.Arrays;

public class RunTimeTest {

public static void main(String arguments[]) {
ProcessBuilder processBuilder = new ProcessBuilder(Arrays.asList("notepad.exe"));

Process process = null;
try {
process = processBuilder.start();
final Process processToKill = process;
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Shutdown Hook");
processToKill.destroy();
}
}));
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
} finally {
if (process != null) {
System.out.println("End of try");
process.destroy();
}
}
}
}

参见 Javadoc for Runtime

关于java - 如何清理由 Runtime.exec() 启动的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24727227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com