Java中Process的waitFor()阻塞问题

3 篇文章 0 订阅
2 篇文章 0 订阅
最近项目需要用java解析3dsmax场景文件,但是3dsmax没有提供java版的api,只能通过max SDK(C++)或者maxScript来解析,为此用maxScript写了个ms文件,然后通过java来调用执行,为了获取执行后的结果,所以使用如下代码:
process = Runtime.getRuntime().exec(cmdStr);  
if(process.waitFor() == 0){
...
}

但是调用后,一致没有反馈,而且通过进程管理器可以发现3dsmax进程,但是没有启动完全,当内存到达某个值的时候就不再变化,开始还以为是jvm设置问题,百度下才发现时process.waitFor的问题。
waitFor() 表示当前 Process 所在的子线程处于等待状态,如有必要,一直要等到由该 Process 对象表示的进程已经终止,网上说如果我们在调用此方法时,如果不注意的话,很容易出现主线程阻塞, Process 也挂起的情况。这就是我遇到的问题,网上的解决办法是,在调用 waitFor() 的时候, Process 需要向主线程汇报运行状况,所以要注意清空缓存区,即 InputStream 和 ErrorStream ,注意这里 InputStream 和 ErrorStream 都需要清空。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


public class ProcessStreamClean extends Thread {
private InputStream inputStream;
private String type;

public ProcessStreamClean(InputStream inputStream, String type) {
this.inputStream = inputStream;
this.type = type;
}

public void run() {
try {
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream);
BufferedReader br = new BufferedReader(inputStreamReader);
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(type + ">" + line);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}

接下来通过函数来调用
public class ProcessTest {

public static void main(String[] args) {
Process process = null;
try {
String cmd = "\"F:/develop/Autodesk/3ds Max 2013/3dsmax.exe\""
process = Runtime.getRuntime().exec(cmd);
new ProcessStreamClean(process.getInputStream(), "INFO").start();
new ProcessStreamClean(process.getErrorStream(), "ERROR").start();
int status = process.waitFor();
System.out.println("Process exitValue: " + status);
} catch (Exception e) {
System.out.println("执行" + cmd + "出现错误," + e.toString());
} finally {
if (process == null) {
process.destroy();
}
process = null;
}
}

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值