我正在使用p = Runtime.getRuntime()。exec(" myScript.sh");作为按钮A的addActionListener(new ActionListener()。
的actionPerformed(ActionEvent evt)的一部分。我想有办法终止这个过程。我试图创建另一个调用p.destroy()的按钮(按钮B)。但是,看起来在点击按钮A后,它会启动该过程,直到该过程结束,我才能点击GUI上的其他按钮(包括右上角的关闭按钮)。所以我不能在中间终止这个过程。
有什么方法可以终止这个过程吗?或者,当按钮A启动的进程仍在运行时,是否有任何方法可以单击其他按钮?
我注释掉了p.waitFor();单击btnRun
后,我仍然无法单击其他按钮 private Process p;
btnRun.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
String s;
try {
p = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((s = br.readLine()) != null)
System.out.println(s);
//p.waitFor();
//System.out.println ("exit: " + p.exitValue());
//p.destroy();
} catch (Exception e) {}
}
});
btnTerminate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
p.destroy();
}
});
答案 0 :(得分:0)
BufferedReader的while循环处理行也会阻止EDT。 BufferedReader将尝试读取流,直到它关闭,并在Process完成时关闭。在此之前,EDT被readLine()
阻止。你必须在另一个线程中处理这些行。
参见此示例
class InStreamPrinter extends Thread {
InputStream is;
InStreamPrinter(InputStream is) {
this.is = is;
}
@Override
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 e) {
e.printStackTrace();
}
}
}
然后将输入流从Process传递给此Thread并启动它。
...
p = Runtime.getRuntime().exec(command);
new InStreamPrinter(p.getInputStream()).start();
...