当前位置: 首页 > 知识库问答 >
问题:

Java停止进程和关闭流

萧光华
2023-03-14

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

我从来没有得到“error end”,调试程序显示线程只是位于“readline()”。

等待进程的代码在它自己的线程中运行(与终止进程的代码分开)。

我需要做什么来确保errorPrinter线程死亡?

共有1个答案

郭意
2023-03-14

我遇到了同样的问题,我使用了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();
 类似资料:
  • 我有一个使用Twitter4j启动的Android应用程序,如果我不再需要该流,我正在寻求有关如何停止/关闭它的帮助。我在偏好更改时启动流,但需要根据用户操作在应用程序的其他部分停止它。 以下是我启动流的方式,这是我在文档中找到的典型方式: 任何帮助将不胜感激,谢谢!

  • 问题内容: 如何在Linux和Windows中正常停止Java进程? 什么时候被调用,什么时候不被调用? 终结器又如何呢? 我可以从外壳向Java进程发送某种信号吗? 我正在寻找最好的便携式解决方案。 问题答案: 在所有未强制终止VM的情况下,都会执行关机挂钩。因此,如果要发出“标准” kill(通过kill命令),则它们将执行。同样,它们将在调用后执行。 但是,如果将其强行杀死(),它们将不会执

  • 我试图重新创建Connect四,我成功了。但我想通过频繁地切换颜色,给玩家一个获胜的四张光盘在哪里的指示。我对线程和编程中的时间概念是新的。 我也成功地给了用户这个指示,但是在关闭应用程序之后,控制台仍然会给出输出,也是在使用SetonCloserEquest时。 代码如下:

  • 我已经将带有html小程序标记的小程序启动迁移到带有小程序描述符的jnlp部署。 对于小程序解决方案,当浏览器窗口关闭时,java应用程序结束。 使用JNLP解决方案,当窗口关闭时,java应用程序不会停止。并引发异常: 非常感谢。

  • 如何停止并关闭hazelcast集群?我从测试中观察到,每当一个节点ist被HazelcastInstance#关闭()停止时,集群都会尝试重新平衡或备份数据。我如何首先“停止”集群,然后将其关闭?(或者我的观察是错误的?)

  • 问题内容: 我正在通过SSH(Putty)在Linux机器上工作。我需要让一个进程在夜间运行,所以我想可以通过在后台启动该进程(在命令末尾使用&号)并将stdout重定向到文件来实现。 令我惊讶的是,这行不通。一旦关闭“腻子”窗口,该过程就会停止。 如何防止这种情况发生? 问题答案: 检出“ nohup ”程序。