概述
1.
Process process = Runtime.getRuntime().exec("cmd /c start tester.exe");
process.waitFor();
process.waitFor();
这个代码中的process.waitFor();并没有起到作用
后面的代码在调用的tester.exe还没结束就继续运行了,
结果发现是因为在exec里面用了start
这样的后果是process.waitFor()等待的是一个一闪而过的用来打开exe的命令行窗口而已.
去掉start这个词,就会等到exe结束程序在继续执行了.
2.
如果exec后面执行的是其他命令行语句(没有start),若要等到Process process = Runtime.getRuntime().exec("cmd......");执行完毕后才执行余下的其他程序,则应该在这句后面加上process.waitFor();这句,但是又遇到了另一个问题:明明Process已经结束了,但是waitFor()还是阻塞在那里,那是因为Process的inputStream缓存造成的,我们现在另外再起一个线程,来监控我们的Process,实时清空缓存就可以解决这个问题了。
import java.util.ArrayList;
import java.util.Scanner;
public class WatchThread extends Thread {
Process p;
boolean over;
ArrayList<String> stream;
public WatchThread(Process p){
this.p = p;
over = false;
stream = new ArrayList<String>();
}
public void run() {
try {
if(p == null)return;
Scanner br = new Scanner(p.getInputStream());
while (true) {
if (p==null || over) break;
while(br.hasNextLine()){
String tempStream = br.nextLine();
if(tempStream.trim()==null||tempStream.trim().equals(""))continue;
stream.add(tempStream);
}
}
} catch(Exception e){
e.printStackTrace();
}
}
public void setOver(boolean over) {
this.over = over;
}
public ArrayList<String> getStream() {
return stream;
}
}
然后在process.waitFor() ;之前插入
WatchThread wt = new WatchThread(process);
wt.start();
在process.waitFor() ;之后插入
ArrayList<String> commandStream = wt.getStream();
wt.setOver(true);
这样,即清空了inputStream,又不会造成需要的人无法获取inputStream的信息,waitFor()阻塞的问题也解决了。
参考原文:
http://www.blogjava.net/jayslong/archive/2011/04/07/why_java_process_waitfor_not_waiting.html
http://ishare.iask.sina.com.cn/f/24118854.html
最后
以上就是狂野机器猫为你收集整理的process.waitFor()的问题的全部内容,希望文章能够帮你解决process.waitFor()的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复