Process.waitFor(), threads, and InputStreams Process.waitFor()方法是一个在Java中用于等待子进程完成的方法。它会阻塞当前线程,直到子进程执行完毕。通过使用这个方法,我们可以确保在子进程完成之前,不会继续执行后续的代码。 线程(threads)是在操作系统中独立运行的最小单位。它们允许我们同时执行多个任务。在Java中,我们可以通过创建新的线程来并行执行代码。这样可以提高程序的性能和响应速度。 InputStreams是Java中用于读取输入流的类。它们用于从某个源(如文件或网络)读取数据。InputStreams提供了许多用于读取数据的方法,可以根据需要逐个字节或一次读取多个字节。 请注意,以上内容中的HTML标签和引号内的内容不会被翻译。

12 浏览
0 Comments

Process.waitFor(), threads, and InputStreams Process.waitFor()方法是一个在Java中用于等待子进程完成的方法。它会阻塞当前线程,直到子进程执行完毕。通过使用这个方法,我们可以确保在子进程完成之前,不会继续执行后续的代码。 线程(threads)是在操作系统中独立运行的最小单位。它们允许我们同时执行多个任务。在Java中,我们可以通过创建新的线程来并行执行代码。这样可以提高程序的性能和响应速度。 InputStreams是Java中用于读取输入流的类。它们用于从某个源(如文件或网络)读取数据。InputStreams提供了许多用于读取数据的方法,可以根据需要逐个字节或一次读取多个字节。 请注意,以上内容中的HTML标签和引号内的内容不会被翻译。

下面是我在伪代码中的操作:

Process proc = runtime.exec(command);
processOutputStreamInThread(proc.getInputStream());
processOutputStreamInThread(proc.getErrorStream());
proc.waitFor()

然而,有时候processOutputStreamInThread看不到任何输出,有时候却能看到。大致上,这个方法创建了一个命令输出的BufferedInputStream并将其发送到一个日志记录器中。

根据我的观察,我猜测command不需要将其所有的输出都倒入由getInputStream()getErrorStream()提供的流中,因此允许流为空。

我的一些试验结果引发了以下几个问题:

(1)java.lang.Process中,waitFor()是否要求执行的程序的输出在其返回之前已经被读取?

文档只是说明了:

如果需要,导致当前线程等待,直到由此Process对象表示的进程终止。如果子进程已经终止,此方法将立即返回。如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。

(2) 在什么条件下,由getInputStreamgetErrorStream提供的流需要被关闭或者它们是否会自动关闭?

文档只是说明了:

获取子进程的错误流。该流从由此Process对象表示的进程的错误输出流中获取数据。

实现注意事项:最好为输入流进行缓冲。

一个用户报告称他不得不自己关闭这些流,但是我有时候会遇到异常,显示在我尝试关闭流时流已经关闭。

编辑:getOutputStream改为getInputStream,现在已在上方出现。

解决:问题最终是由于在某些情况下,用于处理输出流的线程在我非常短暂的进程完成之后才开始运行,导致输入流没有给我任何数据。 waitFor并没有等待执行程序的输出。相反,程序在收集任何输出之前运行并终止。

我使用线程是因为我不确定标准错误和标准输出会有多少输出,我希望能够同时处理两者,而不阻塞其中一个,只有当它们中的一个有数据可用时才阻塞。但是,由于我的线程不能一致地读取执行程序的输出,这不是一个解决办法。

我的最终代码大致如下:

ProcessBuilder pb = new ProcessBuilder(cmdargs);
pb.redirectErrorStream(true);
Process proc = pb.start();
processOutputStream(proc.getInputStream());
proc.waitFor()

0