我是靠谱客的博主 狂野机器猫,这篇文章主要介绍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,实时清空缓存就可以解决这个问题了。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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() ;之前插入

复制代码
1
2
WatchThread wt = new WatchThread(process); wt.start();
在process.waitFor() ;之后插入

复制代码
1
2
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()内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部