我正在使用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线程死亡?
我遇到了同样的问题,我使用了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 ”程序。