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设置超时相关推荐

  1. java process.waitfor();,正确的调用系统命令——为Process.waitFor设置超时以及其他 | 学步园...

    Java中在阻塞调用系统命令的时候,一般是使用Runtime.getRuntime().exec(command)返回一个process对象,再调用Process.waitFor()来等待命令执行结束 ...

  2. process设置超时_概述并设置Process Center单集群拓扑

    process设置超时 这个由三部分组成的系列指南将指导您使用IBM Business Process Manager(BPM)高级版V8.5建立具有常用拓扑的业务流程管理环境. 本系列文章首先快速概 ...

  3. php time 循环不变,PHP为系统调用的脚本设置超时,set_time_limit不起作用

    我有一个命令行PHP脚本,使用foreach使用数组的每个成员运行wget请求.这个wget请求有时可能需要很长时间,因此我希望能够设置超时以杀死脚本(例如,如果超过15秒).我已禁用PHP安全模式并 ...

  4. java执行python返回null_[转]java调用python脚本以及通过Process.waitFor()直接调用python模块返回错误代码1的一种解决办法...

    常见的java调用python脚本方式 通过jython提供的类库实现 通过Runtime.getRuntime()开启进程来执行脚本文件 通过jython提供的类库实现 通过jython实现的话,我 ...

  5. Process#waitFor()阻塞问题

         有时需要在程序中调用可执行程序或脚本命令: Process process = Runtime.getRuntime().exec(shPath); int exitCode = proce ...

  6. Axis2 客户端调用 设置超时时间

    我用的是axis2-1.6.2版本.请看下面的客户端代码: import org.apache.axis2.client.Options; import com.ctis.ta.service.imp ...

  7. 怎样判断子进程已经结束 process.waitFor();的问题

    怎样判断子进程已经结束 process.waitFor();的问题 2009年07月31日 14:38 来源:普索网 发表于:2007-02-28 10:25:04 楼主 ProcessBuild.c ...

  8. HttpClient 如何设置超时时间

    今天分享一个巨坑,就是 HttpClient.这玩意有多坑呢?就是每个版本都变,近日笔者深受其害. 先看一下代码,我要发送请求调用一个c++接口. public static String doPos ...

  9. 【Java 网络编程】服务器端 ServerSocket 配置 ( 端口复用 | 缓冲区设置 | 超时时间 | 性能权重 | 端口绑定 )

    文章目录 I ServerSocket 端口号绑定参数 II ServerSocket 复用绑定端口设置 III ServerSocket 设置缓冲区大小 IV ServerSocket 设置超时时间 ...

最新文章

  1. 十分钟完成Bash 脚本进阶!列举Bash经典用法及其案例
  2. 【 MATLAB 】cat 函数介绍(沿指定维度串联数组)
  3. IOS常用代码总结 - 第三方库部分
  4. Interview:算法岗位面试—10.16下午—上海某公司算法岗位(偏图像算法,国内顶端医疗行业)技术面试之一点技术都没问
  5. android组件通讯 Intent-Action属性
  6. 分享10个Android游戏源码,要的赶紧来哈
  7. 计算机操作员实操高级试题,计算机操作员高级实操(以往考过,可做平时练习素材)答题.doc...
  8. C# 中执行 msi 安装
  9. 力扣347. 前 K 个高频元素(JavaScript,堆)
  10. 并行算法第四讲:比较器网络选择和排序
  11. 路由器OpenWRT、LEDE、潘多拉、华硕、梅林、老毛子系统区别和特点
  12. 四叉树(QuadTree)图例、应用、实现
  13. AMS1117和LM2596S芯片的问题总结
  14. html中form异步验证,form表单验证
  15. Android仿人人客户端(v5.7.1)——项目框架新做的调整描述(项目中基类java源码)
  16. 2021年电子元器件行业涨价趋势已现
  17. 谁挡道就骂谁,这个暴躁版扫地机器人火了,东北话也可以,网友:想劈了它...
  18. sql2java-excel(一):基于apache poi实现数据库表的导出及支持spring web
  19. a8处理器相当于骁龙几_天玑800相当于骁龙多少 天玑800和骁龙765G对比哪个好
  20. 第二篇:SpringCloud 服务的注册与发现Eureka(Dalston.SR5版本)

热门文章

  1. @echo 与 echo的区别
  2. 阿里云助力合作伙伴帮助政府、企业体验云计算大数据魅力!
  3. DirectX 开发环境配置
  4. emca 更改监听端口
  5. StringBuilder/StringBuffer类
  6. 书------编程(理论方面)
  7. Python的代码结构
  8. GPU 加速下的图像视觉
  9. 开篇辞 vuejs 快讯 - 109 期
  10. 度量.net framework 迁移到.net core的工作量