【问题标题】:When running jar program from java code, the jar program's gui freezes on direct input从 java 代码运行 jar 程序时,jar 程序的 gui 在直接输入时冻结
【发布时间】:2012-08-22 12:51:18
【问题描述】:

为了了解这种情况,我尝试描述我想要实现的目标: 我想创建一个 java 程序来启动另一个 java 程序(一个 minecraft 服务器),监视它的输出,并相应地向它的输入发送命令。

我能够从我的代码中启动 jar 程序,并且我还能够为它编写一个输出侦听器,目前仅将 jar 程序的输出打印到控制台。

我从我的代码运行的 jar 程序有一个带有文本输出面板的 gui,它在其中显示消息,以及一个输入字段 (textarea),我可以在其中给出命令。我的问题是,当我启动代码并启动程序时,一切正常,直到我想直接写入程序的输入字段。如果我在输入字段中输入任何字母,则 gui 会冻结。

我做错了什么?

这是我的代码:

public static void main(String[] args) {
    try {
        System.out.println("Starting.");
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec("java -jar \"D:\\Program Files\\mc\\minecraft_server.jar\"");
        // output both stdout and stderr data from proc to stdout of this process
        StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream());
        StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream());
        errorGobbler.start();
        outputGobbler.start();

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

输出阅读器:

public class StreamGobbler extends Thread {
    InputStream is;

    // reads everything from is until empty.
    StreamGobbler(InputStream is) {
        this.is = is;
    }

    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null)
                System.out.println(line);
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

提前致谢! :)

【问题讨论】:

  • 为了简单起见,合并out & err 流。实际上在那里看到 2 个流,我愚蠢地认为 gobblers 正在消耗两个输出流,但它当然是在读取 errin使用out 流! 并阅读exec info. page 中的链接文章并实施所有其他建议。
  • 感谢您的建议,但问题仍然存在:为什么 gui 会冻结?我只是在运行程序。我没有缓和任何东西......
  • 非常感谢您执行我的建议和编辑问题。哦,等等,您没有打扰。 “问题仍然存在:” 好吧,你是有明确动机去解决它的人,所以我会继续讨论评论 1 中推荐的那些事情。祝你好运!
  • 好的。我合并了流。这显然与问题无关,它只是一个优化。我不明白为什么我要消耗 out strem?当我将输出插入阅读器并尝试阅读它时,什么也没发生,但是当我阅读“输入流”(从罐子的角度来看似乎是输出流)时,一切正常。我收到了 jar 发送的所有消息。我将实现其他的东西,但我想从这个开始。
  • “我将实现其他的东西,但我想从这个开始。” 从实现“其他的东西”开始,因为正如我在链接页面..“文章是首先检查进程是否失败的事情。实施所有提示..”

标签: java runtime.exec


【解决方案1】:

首先,不使用stream gobbler,直接继承进程的io:

final ProcessBuilder p1 = new ProcessBuilder(command).inheritIO();
p1.start();

如果您不关心标准输入/输出,请使用它来将所有内容定向到 NUL(/dev/null 的 Windows 版本):

p1.redirectInput(Redirect.from(new File("NUL"))).redirectOutput(Redirect.to(new File("NUL")))
                        .redirectError(Redirect.to(new File("NUL")));

程序还会崩溃吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2013-06-30
    • 2011-02-05
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多