如何终止java启动的进程

时间:2018-04-19 19:37:10

标签: java swing user-interface process

我正在使用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();
        }
    });

1 个答案:

答案 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();
...