如何终止由java启动的进程
我使用的是p=Runtime.getRuntime.execmyScript.sh;作为按钮a的addActionListenernew ActionListener的actionPerformedActionEvent evt的一部分 我想有一个方法来终止这个过程。我试图创建另一个按钮B,它调用p.destroy。但是,在单击按钮A之后,它会启动流程,只有在流程完成之前,我才能单击其他按钮,包括GUI右上角的关闭按钮。所以我不能在中间终止这个过程。 我有没有办法终止这个过程?或者,当按钮A启动的进程仍在运行时,我是否可以单击其他按钮 我把p.waitFor注释掉了;单击btnRun后,我仍然无法单击其他按钮如何终止由java启动的进程,java,swing,user-interface,process,Java,Swing,User Interface,Process,我使用的是p=Runtime.getRuntime.execmyScript.sh;作为按钮a的addActionListenernew ActionListener的actionPerformedActionEvent evt的一部分 我想有一个方法来终止这个过程。我试图创建另一个按钮B,它调用p.destroy。但是,在单击按钮A之后,它会启动流程,只有在流程完成之前,我才能单击其他按钮,包括GUI右上角的关闭按钮。所以我不能在中间终止这个过程。 我有没有办法终止这个过程?或者,当按钮A启动
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();
}
});
来自BufferedReader的while循环处理线也会阻塞EDT。BufferedReader将尝试读取流,直到它被关闭,并且在进程完成时它将被关闭。在此之前,EDT被读线阻塞。您必须在另一个线程中处理这些行 看这个例子
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();
}
}
}
然后将输入流从进程传递到该线程并启动它
...
p = Runtime.getRuntime().exec(command);
new InStreamPrinter(p.getInputStream()).start();
...
您的GUI线程似乎被exec启动的进程阻塞了。你确定你没有在这个过程中打电话给waitFor吗?无论如何,a会有很大帮助。从声音上看,如果是,你正在阻止事件调度线程,可能类似于或可以help@MadProgrammer是的,你说得对。我正在阻止EDT。我看了你的例子。这对我来说很难完全理解,但它绝对是一个很棒的工具。SwingWalker!我实现了MatheM的解决方案。但是非常感谢你@WenhaoGeng您还应该更喜欢ProcessBuilder而不是Runtimeexec,因为它更具可配置性,并且允许您将错误流与输入流合并-这是MatheM的答案,但它不起作用!非常感谢你。你太棒了,直接发现了我的问题所在!