使用ProcessBuilder重启后,Swing应用程序运行缓慢

时间:2014-10-13 09:38:29

标签: java swing processbuilder

我有一个需要自动重启的Java Swing应用程序。我已经用这种方式实现了它:

final String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
        final File currentJar = new File(UltraCoinApp.class.getProtectionDomain().getCodeSource().getLocation().toURI());

        /* is it a jar file? */
        if(currentJar.getName().endsWith(".jar")) {
        /* Build command: java -jar application.jar */
            final ArrayList<String> command = new ArrayList<String>();
            command.add(javaBin);
            command.add("-jar");
            command.add(currentJar.getPath());

            final ProcessBuilder builder = new ProcessBuilder(command);

            builder.start();
        }
        System.exit(0);

重启后,GUI非常慢,所有元素响应都很慢。我怀疑这可能是因为记录输出。

1 个答案:

答案 0 :(得分:1)

ProcessBuilder的一个重要规则是你必须阅读子进程的输出,否则它最终会挂起。

这意味着你在启动进程时必须要redirect stdout,否则你必须在父进程的循环中读取输出。

另一个解决方案是使用外部进程(脚本或可执行文件)在循环中运行JAR。要终止,请在重启过程中调用System.exit(1)并检查退出代码。

如果所有这些都没有帮助,那么您必须使用分析器来找出应用程序实际上一直在花费的时间。