我有以下问题:
我有简单的.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秒。
答案 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();;