Java中Process.waitFor()与Process.exitValue()的区别是什么?
Java Process类waitFor()和exitValue()的核心差异
那必须有差异啊,这俩方法的核心行为差得老远了,我给你拆解明白:
1. 阻塞行为完全不同
waitFor(): 调用它的线程会直接“停在这儿等”——也就是阻塞,直到子进程彻底执行完毕、退出为止。等进程结束后,它才会返回进程的退出状态码(一般0代表正常结束,非0就是出问题了)。
举个例子:如果你用Process调用了一个外部脚本生成报表,必须等报表生成完才能继续处理,这时候waitFor()就是刚需,不然你去读文件的时候可能文件还没写完。exitValue(): 这个是“急性子”,调用后立刻返回,但有个大前提:只有子进程已经退出的时候,它才会乖乖给你返回状态码;要是进程还在跑着呢,直接调用它会甩给你一个IllegalThreadStateException异常,绝对不带客气的。
2. 适用场景不一样
- 用
waitFor()的场景:你需要依赖子进程的执行结果,必须等它做完才能继续当前逻辑,或者你想确保子进程彻底退出后再释放资源。另外它还有个重载版本waitFor(long timeout, TimeUnit unit),可以设置超时时间,避免线程无限期阻塞在这儿。 - 用
exitValue()的场景:你确定子进程已经结束了(比如之前已经调用过waitFor(),或者你通过其他方式判断进程终止了),这时候用它快速获取状态码就行,不用再等。
代码示例直观对比
public class ProcessDemo { public static void main(String[] args) throws IOException, InterruptedException { Process process = new ProcessBuilder("ping", "localhost").start(); // 情况1:用waitFor()等待进程结束 int waitExitCode = process.waitFor(); System.out.println("waitFor()获取的状态码:" + waitExitCode); // 情况2:此时进程已经结束,调用exitValue()没问题 int exitCode = process.exitValue(); System.out.println("exitValue()获取的状态码:" + exitCode); // 要是刚启动进程就调用exitValue(),大概率会抛异常 // Process newProcess = new ProcessBuilder("ping", "localhost").start(); // int errCode = newProcess.exitValue(); // 这里会抛出IllegalThreadStateException } }
内容的提问来源于stack exchange,提问作者sb27
相关产品推荐
相关产品推荐

