一个以Runtime.getRuntime()开头的jar.exec()比命令行运行的时间更长

时间:2015-03-06 22:22:57

标签: java runtime

我有以下问题:

我有简单的.jar程序,他在文本控制台中写道。

如果我开始使用cmd(java -jar myProgram.jar),该程序将 1秒

但我想使用JButton从另一个程序启动程序:

startMyProgram.addActionListener(new ActionListener() {
        @Override
             public void actionPerformed(ActionEvent e) {
             // Run a java app in a separate system process
             Process proc = Runtime.getRuntime().exec("java -jar myProgram.jar");

             // Then retreive the process output
             InputStream in = proc.getInputStream();
             InputStream err = proc.getErrorStream();
             System.out.println(convertStreamToString(in));
        }
 });

如果我使用第二种方式(JButton方式),程序运行 10秒

为什么呢?为什么跑这么久? 如果我开始他通过另一个线程,它需要太长时间到10秒。

1 个答案:

答案 0 :(得分:1)

基于来自When Runtime Exec Won't的StreamGobbler而不直接扩展Thread。

public class StreamGobbler implements Runnable {
    private InputStream in;
    public StreamGobbler(InputStream in) {
        this.in = in;
    }
    @Override
    public void run() {
        InputStreamReader isr = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(isr);
        try {
            String line = null;
            while ((line = br.readLine()) != null) {
                // could log it here
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用它在exec()

之后接收来自流的所有输出
Process proc = Runtime.getRuntime().exec("java -jar myProgram.jar");
...
new Thread(new StreamGobbler(in)).start();
new Thread(new StreamGobbler(err)).start();;