最近项目需要用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;
}
}
}
分享到:
相关推荐
JAVA Process 使用JAVA Process 使用JAVA Process 使用JAVA Process 使用JAVA Process 使用JAVA Process 使用
java imageProcess 图像处理程序模板,java imageProcess 图像处理程序模板
实现内存动态分区,运用Java语言,一共四个类,这是process类
JSF是由Java Community Process (JCP)制定的一个Web应用框架标准。JSF具有良好定义的请求处理生命周期和丰富的组件层次结构,旨在推动基于Java的Web用户界面开发的简易性。利用JSF提供的可重用、可扩展、基于组件的...
jni win32 sdk java 任务管理器
NULL 博文链接:https://sghfofo.iteye.com/blog/571105
There is extensive coverage of new Java 9 features, such as the new layout of the modular JDK/JRE runtime image, new convenience factory methods for creating collections, the new spin-wait hints ...
用Java编写的图像处理的小程序,效果不错
使用PROCESS v3.3 for SPSS,测量中介变量。使用PROCESS v3.3 for SPSS,测量中介变量。
Process是一款用于spss软件中的调节效应插件,专门进行分析中介效应和调节效应,Process主要应用于SPSS、SAS等传统数据统计分析软件,在SPSS中除了可以可视化操作外,还可以通过Syntax语法等方式操作,扩展功能更为...
进程控制块的设计与实现 进程的创建,执行,阻塞,唤醒。 还有进程调度,采用了短作业优先和先来先服务算法
Java 常用的流程控制操作经典代码Java process control operations used classic code
Data Science with Java: Practical Methods for Scientists and Engineers by PhD Michael R. Brzustowicz English | 6 Jun. 2017 | ASIN: B072MKRQBQ | 236 Pages | AZW3 | 2.78 MB Data Science is booming ...
全面解决Generic host process for win32 services遇到问题需要关闭
SPSS的插件process 3.0版本可以加快简化中介效应、调节效应、被调剂的中介效应、被中介的调节效应的检验
JAVA语言实现对图像进程的控制和操作,内含25个文件
ExcelProcess.java
It is lecture notes for Random Process at UIUC, if you have interests, just have a look
t as simple as sitting down and answering questions The technical ...Java coders can prepare themselves for this daunting process and better arm themselves with the knowledge and interviewing skills ...
Java中使用Runtime和Process类运行外部程序