Process.waitFor(), threads, and InputStreams Process.waitFor()方法是一个在Java中用于等待子进程完成的方法。它会阻塞当前线程,直到子进程执行完毕。通过使用这个方法,我们可以确保在子进程完成之前,不会继续执行后续的代码。 线程(threads)是在操作系统中独立运行的最小单位。它们允许我们同时执行多个任务。在Java中,我们可以通过创建新的线程来并行执行代码。这样可以提高程序的性能和响应速度。 InputStreams是Java中用于读取输入流的类。它们用于从某个源(如文件或网络)读取数据。InputStreams提供了许多用于读取数据的方法,可以根据需要逐个字节或一次读取多个字节。 请注意,以上内容中的HTML标签和引号内的内容不会被翻译。
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) 在什么条件下,由getInputStream
和getErrorStream
提供的流需要被关闭或者它们是否会自动关闭?
文档只是说明了:
获取子进程的错误流。该流从由此Process对象表示的进程的错误输出流中获取数据。
实现注意事项:最好为输入流进行缓冲。
一个用户报告称他不得不自己关闭这些流,但是我有时候会遇到异常,显示在我尝试关闭流时流已经关闭。
编辑:将getOutputStream
改为getInputStream
,现在已在上方出现。
解决:问题最终是由于在某些情况下,用于处理输出流的线程在我非常短暂的进程完成之后才开始运行,导致输入流没有给我任何数据。 waitFor
并没有等待执行程序的输出。相反,程序在收集任何输出之前运行并终止。
我使用线程是因为我不确定标准错误和标准输出会有多少输出,我希望能够同时处理两者,而不阻塞其中一个,只有当它们中的一个有数据可用时才阻塞。但是,由于我的线程不能一致地读取执行程序的输出,这不是一个解决办法。
我的最终代码大致如下:
ProcessBuilder pb = new ProcessBuilder(cmdargs); pb.redirectErrorStream(true); Process proc = pb.start(); processOutputStream(proc.getInputStream()); proc.waitFor()