欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

为Process.waitFor设置超时

发布时间:2025/7/14 编程问答 51 豆豆
生活随笔 收集整理的这篇文章主要介绍了 为Process.waitFor设置超时 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

2019独角兽企业重金招聘Python工程师标准>>>

Java中在使用Runtime.getRuntime().exec(command)调用系统命令后
一般会调用Process.waitFor()来等待命令执行结束 获取执行结果
今天一个悲剧的事实证明了
即使只是调用了很简单的脚本命令
在调用Process.waitFor()后同样可能发生无休止或者接近于无休止的阻塞
处理完故障之后痛定思痛
决定在代码中加入超时控制
但是Process.waitFor()本身并不支持超时时间设置
一个方法是改用非阻塞的Process.exitValue()方法
然后轮询检查进程状态 这种方式比较消耗CPU
以至于轮询间隔也不能设置得太小 总归不是很完美
另外就是多起一个线程
借助于其他的超时机制来控制
最后使用的代码如下


public class ProcessUtils {/*** 运行一个外部命令,返回状态.若超过指定的超时时间,抛出TimeoutException* @param command* @param timeout* @return* @throws IOException* @throws InterruptedException* @throws TimeoutException*/public static int executeCommand(final String command, final long timeout) throws IOException, InterruptedException, TimeoutException {Process process = Runtime.getRuntime().exec(command);Worker worker = new Worker(process);worker.start();try {worker.join(timeout);if (worker.exit != null){return worker.exit;} else{throw new TimeoutException();}} catch (InterruptedException ex) {worker.interrupt();Thread.currentThread().interrupt();throw ex;} finally {process.destroy();}}private static class Worker extends Thread {private final Process process;private Integer exit;private Worker(Process process) {this.process = process;}public void run() {try {exit = process.waitFor();} catch (InterruptedException ignore) {return;}}}}



转载于:https://my.oschina.net/u/220934/blog/303867

总结

以上是生活随笔为你收集整理的为Process.waitFor设置超时的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。