【问题标题】:Shutting down Process started with Runtime exec();关闭以运行时 exec() 开始的进程;
【发布时间】:2015-08-21 09:25:10
【问题描述】:

我使用 Process proc Runtime.getruntime.exec(); 从我的 java swing 文件中启动一个 JAR 文件,我需要将其关闭,以便它在所有操作系统上都能正常工作。

我已经尝试过proc.detroy();,但这并不能让它完全关闭,并且会导致程序出现问题。

我需要做什么才能让它在所有操作系统上安全关闭?

我认为我需要检查正在使用的操作系统并分别处理每个操作系统,但应该如何才能安全地关闭每个操作系统?

这里是 StartStop.java 代码:

public class StartStop {

    static Process proc = null;

    public void program() {
        new Thread() {
            public void run() {
                try {
                    proc = Runtime.getRuntime().exec("java -jar DEDServer_release.jar");

                    String res = org.apache.commons.io.IOUtils.toString(new BufferedReader(new InputStreamReader(proc.getErrorStream())));
                    if(res.contains("Error")){
                        JOptionPane.showMessageDialog(null, "Failed to start DEDServer. Make sure that this file is in the same directory as DEDServer_release.jar");
                    }

                }catch (IOException e) {
                    JOptionPane.showMessageDialog(null, "Failed to start DEDServer. Make sure that this file is in the same directory as DEDServer_release.jar");
                }
            }
        }.start();

    }

}

感谢您的帮助。

【问题讨论】:

  • JOptionPane 必须包含在 invokeLater 中,更多请阅读 Oracle 教程 Initial Thread
  • 为什么 process.destroy() 不起作用?
  • @JPMoresmau 问题中说...“我已经尝试过 proc.detroy(); 但这并不能让它完全关闭,并且会导致程序出现问题。”跨度>
  • 好吧 process.destroy() 杀死子进程,这就是它应该做的。 Java 的全部意义在于您不必编写特定于平台的代码。所以你应该明白为什么你的程序在请求时没有关闭。可能更好的方法是能够向您的 DEDServer 程序发送命令以使其干净地关闭。
  • 你需要阅读stackoverflow.com/questions/2950338/…stackoverflow.com/questions/191215/…。我的建议不是通过操作系统特定的方式,而是让您的服务器代码监听“退出”命令的标准输入。当它收到该命令时,它会优雅地关闭。

标签: java swing process runtime shutdown


【解决方案1】:

Java8引入了一个更强大的API,叫做destroyForcibly(),试试用吧,

以下是相同的文档,

public Process destroyForcibly()

杀死子进程。此 Process 对象所代表的子进程被强制终止。

此方法的默认实现调用destroy(),因此可能不会强制终止进程。强烈鼓励此类的具体实现使用兼容的实现覆盖此方法。对 ProcessBuilder.start() 和 Runtime.exec(java.lang.String) 返回的 Process 对象调用该方法会强制终止进程。

注意:子进程可能不会立即终止。即 isAlive() 可能会在调用 destroyForcibly() 后的短时间内返回 true。如果需要,此方法可以链接到 waitFor()。

另外,如果destroyForcibly 不起作用,我建议您查看post 了解更多信息。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2018-01-24
相关资源
最近更新 更多