Java停止进程和关闭流

时间:2016-04-30 18:12:57

标签: java processbuilder

我使用ProcessBuilder启动外部进程,但我需要能够杀死它。现在我没有问题杀死进程但由于某种原因错误流没有关闭所以读取流的线程永远不会完成。这使我无法关闭我的程序。

这里我开始从输入和错误流中读取线程。

                final Thread inputPrinter = new Thread() {
                    public void run() {
                        BufferedReader inputStream = new BufferedReader(new InputStreamReader(builder.getInputStream()));
                        String line;
                        try {
                            while ((line = inputStream.readLine()) != null) {
                                Util.println(line, false);
                            }
                        } catch (IOException e) {
                        } finally {
                            Util.println("input end");
                            try {
                                inputStream.close();
                            } catch (IOException e) {
                            }
                        }
                    }
                };
                inputPrinter.start();

                Thread errorPrinter = new Thread() {
                    public void run() {
                        BufferedReader errorStream = new BufferedReader(new InputStreamReader(builder.getErrorStream()));
                        String line;
                        try {
                            while ((line = errorStream.readLine()) != null) {
                                Util.println(line, true);
                            }
                        } catch (IOException e) {
                        } finally {
                            Util.println("error end");
                            try {
                                errorStream.close();
                            } catch (IOException e) {
                            }
                        }
                    }
                };
                errorPrinter.start();
                builder.waitFor();

                Util.println("");
                Util.println("Finished building project.");

这是我停止流程的代码。

        try {
            builder.getOutputStream().close();
            builder.getInputStream().close();
            builder.getErrorStream().close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        builder.destroy();
        Util.println("");
        Util.println("Build aborted by user.", true);

当我尝试停止该过程时,我得到以下打印。

  

由用户中止构建。

     

完成建筑项目。

     

输入结束

我永远不会得到"错误结束"并调试程序显示该线程只是坐在" readLine()"。

等待进程的代码在其自己的线程中运行(与杀死进程的代码分开)。

我需要做些什么才能确保errorPrinter线程死掉?

1 个答案:

答案 0 :(得分:1)

我有同样的问题,我使用了speechRecognizer,所以我正在运行一个单独的线程,它正在运行另一个.jar,它打印到控制台并使用BufferedReader读取输出(类似这样的.. ):

//In seperate Thread from the Main App Thread
while (!stopped) {
                while ((line = bufferedReader.readLine()) != null && !line.isEmpty()) {
                    System.out.println(line);
                    checkSpeechResult(line);
                }
            }

问题

基本上bufferedRead.readLine()滞后,直到有东西要读。

如果什么都没有,它会永远等待。

<强>答案:

另一个帖子调用此:

process.destroy();

它将停止进程,因此bufferedRead.readLine()将退出。