process.waitFor()的问题

1.
Process process = Runtime.getRuntime().exec("cmd /c start tester.exe");
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()还是阻塞在那里,那是因为ProcessinputStream缓存造成的,我们现在另外再起一个线程,来监控我们的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






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值