Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何终止由java启动的进程_Java_Swing_User Interface_Process - Fatal编程技术网

如何终止由java启动的进程

如何终止由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启动

我使用的是p=Runtime.getRuntime.execmyScript.sh;作为按钮a的addActionListenernew ActionListener的actionPerformedActionEvent evt的一部分

我想有一个方法来终止这个过程。我试图创建另一个按钮B,它调用p.destroy。但是,在单击按钮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();
        }
    });

来自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的答案,但它不起作用!非常感谢你。你太棒了,直接发现了我的问题所在!