【问题标题】:Java runtime issue from Swing applicationSwing 应用程序的 Java 运行时问题
【发布时间】:2016-07-19 10:58:08
【问题描述】:

我有一个 swing 应用程序,我正在执行一个 jar 文件,该文件将在内部进行一些处理。我的流程如下: 1. 一个带有main() 的java 文件,它加载swing GUI。从那个 GUI 我可以浏览和加载所需的 jar 文件来执行。

public static void main(String[] args)
{
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            MigrationProcessElementDialog.createAndShowGUI();

        }
    });

}
  1. 从 swing 应用程序中,我将 jar 文件加载为:

Runtime rt = Runtime.getRuntime();   
// replacePath is the path of the jar file to be loaded.
Process proc = rt.exec("java -jar " + replacePath);   
int exitVal = proc.waitFor();
  1. 当我从任务管理器触发执行时,我看到两个 javaw.exe(一个用于 Eclipse,一个用于 SWING GUI)和一个用于程序流的 java.exe。 但是程序流程继续几次(从日志更新中可以看出)但在一段时间后卡住了。

  2. 一旦我杀死了我的 swing GUI javaw.exe;程序流程立即开始并继续其余部分。所以在我看来,javaw.exe 以某种方式阻止了 java.exe 的执行。有可能吗?它的分辨率是多少?

如果我执行,我的进程可执行 jar 从命令提示符使用普通 java -jar "path" 命令,程序流程不会卡住,它按预期工作。

仅当我从 GUI 执行或使用运行时时才会遇到问题。我也使用了 ProcessBuilder;但面临同样的问题。

如果有人可以请给我任何线索,这将非常有帮助。谢谢!

【问题讨论】:

  • 另请参阅When Runtime.exec() won't,了解有关正确创建和处理流程的许多好技巧。然后忽略它引用exec 并使用ProcessBuilder 来创建进程。还将String arg 拆分为String[] args 以解决包含空格字符的路径之类的问题。

标签: java swing processbuilder runtime.exec


【解决方案1】:

您应该处理进程的输出(stdout、stderr)。因为,这些输出将通过三个流(getOutputStream()、getInputStream()、getErrorStream())重定向到父进程。如果不处理,子进程产生输出时会阻塞。

Process documentation

一些原生平台只提供 标准输入和输出流的缓冲区大小有限,无法 及时写入输入流或读取输出流 子进程可能会导致子进程阻塞,甚至死锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2016-01-18
    • 2011-10-31
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多