怎样判断子进程已经结束 process.waitFor();的问题
怎样判断子进程已经结束 process.waitFor();的问题
Process process= ProcessBuild.start();
//
public void run() {
try {
System.out.println( "waitFor() ");
process.waitFor();
}
catch( InterruptedException e) {
throw new RuntimeException( "InterruptedException Exception encountered ", e);
}
if( pro.exitValue() != 0) {
process.destroy();
}
System.out.println( "exitValue ");
}
不知道process.waitFor();这个方法会让当前线程一直等待下去不会停止,我想知道他结束之后能够打印出退出的消息.我就是想实现子进程结束后通知当前线程
希望各位能帮帮忙~~
发表于:2007-02-28 10:42:021楼 得分:7 process.waitFor();
是个组塞方法,如果子进程没有结束,它是不会返回的,
等子进程结束了,程序自然会继续执行下去,
你要问什么?
发表于:2007-02-28 10:45:122楼 得分:0 就是他加了这句话它就不会结束了一直等下去
如果不加这句话等几一段时间它就完成了
发表于:2007-02-28 11:10:053楼 得分:0 你把子进程结束掉,他不就执行下去了么
"如果不加这句话等几一段时间它就完成了 "
这是什么意思?
发表于:2007-02-28 11:17:004楼 得分:0 我开的子进程是个转换视频格试的可执行程序 "ffmpeg.exe "
它转换一个文件完成大概要30秒,不加process.waitFor();的话它30秒后就完成了
我要先判断它的退出值是不是0如果是0的话就表示正常终止
但直接distory()的话可能还没有完成就终止了
我现实现的是子进程完成了通知一下
发表于:2007-02-28 11:37:285楼 得分:0 jay584930074() ( ) 信誉:100 Blog 2007-02-28 11:17:00 得分: 0
我开的子进程是个转换视频格试的可执行程序 "ffmpeg.exe "
它转换一个文件完成大概要30秒,不加process.waitFor();的话它30秒后就完成了
我要先判断它的退出值是不是0如果是0的话就表示正常终止
但直接distory()的话可能还没有完成就终止了
我现实现的是子进程完成了通知一下
--------------------------
你的意思是你要是加了process.waitFor();
即时你的子进程结束了,程序也不执行下去???
真是活见鬼了。
发表于:2007-02-28 13:23:346楼 得分:0 但如果我将WEB服务器停止时它就执行完成了
发表于:2007-02-28 13:34:247楼 得分:0 按照API,process.waitFor();方法会阻塞,一直到子进程结束为止,然后继续运行下去,没有所谓的通知不通知的,你把子进程结束后想要做的工作,写在这个方法后面就可以了。
你可以测试一下,
public class ProcessTest {
public static void main(String args[]){
ProcessBuilder pb = new ProcessBuilder();
pb.command(new String[]{ "notepad.exe "});
try {
Process p = pb.start();
p.waitFor();
System.out.println(p.exitValue());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
程序打开notepad后,将阻塞在waitFor()方法上,关闭notepad后,程序会继续执行,打印出结果
发表于:2007-09-27 15:08:338楼 得分:7 楼主,我也有你同样的问题呀,痛苦中的。
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
Process subprocess = builder.start();
subprocess.waitFor();
System.out.println(subprocess.exitValue());
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
现在我的这段代码执行的情况是,子进程(subprocess)一直在等待主进程结束后,它执行,怎么刚好相反呢
发表于:2007-09-27 23:46:419楼 得分:6 这个问题前不久我刚遇到过,死锁了,看下帮助文档就知道了。
javadoc
The methods that create processes may not work well for special processes on certain native platforms, such as native windowing processes, daemon processes, Win16/DOS processes on Microsoft Windows, or shell scripts. The created subprocess does not have its own terminal or console. All its standard io (i.e. stdin, stdout, stderr) operations will be redirected to the parent process through three streams (getOutputStream(), getInputStream(), getErrorStream()). The parent process uses these streams to feed input to and get output from the subprocess. Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.
最后一段话,死锁的原因是子线程的输出流或输入流缓存太小,所以必须自己手动清空缓存。
在process.waitFor();之前加上一下代码
BufferedReader br = new BufferedReader(process.getInputStream());
while(br.readLine()!=null);
通常这样可以解决,但是线程执行是由cpu控制的,如果process还没被执行,那么while(br.readLine()!=null);就会结束,此时如果process刚好被执行了,但由于while(br.readLine()!=null);已经结束了,process的输入流输出流还是没有被清空,到process.waitFor();时还是会造成堵塞的。
所以,一般我的做法是把上面的代码写到一个监视线程中,比如
class WatchThread extends Thread {
Process p;
boolean over;
public WatchThread(Process p) {
this.p = p;
over = false;
}
public void run() {
try {
if (p == null) return;
BufferedReader br = new BufferedReader(p.getInputStream());
while (true) {
if (p==null || over) {
break;
}
while(br.readLine()!=null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void setOver(boolean over) {
this.over = over;
}
}
然后在process.waitFor()之前,添加
WatchThread wt = new WatchThread(process);
wt.start();
然后在process.waitFor()之后,添加
wt.setOver(true);
怎样判断子进程已经结束 process.waitFor();的问题相关推荐
- Process#waitFor()阻塞问题
有时需要在程序中调用可执行程序或脚本命令: Process process = Runtime.getRuntime().exec(shPath); int exitCode = proce ...
- java Process.waitFor阻塞
关于java Process waitFor() 进程阻塞问题 摘录自:http://lelglin.iteye.com/blog/1487351 问题:有同学遇到java调用Process.exec ...
- java 使用Process调用exe程序 及 Process.waitFor() 死锁问题了解和解决
前言 最近在开发android的同时也在开发java ,碰到了需要使用java 程序调用exe的需求,这里我使用的 process 来调用的.该篇文章 读完需要8+分钟,文章类型为 小白入门类型,此处 ...
- 为Process.waitFor设置超时
2019独角兽企业重金招聘Python工程师标准>>> Java中在使用Runtime.getRuntime().exec(command)调用系统命令后 一般会调用Process. ...
- Java Process.exitValue Process.waitFor()
http://gohands.blogbus.com/logs/172834178.html Process.exitValue() 采用非阻塞的方式返回,如果没有立即拿到返回值,则抛出异常 Proc ...
- java执行python返回null_[转]java调用python脚本以及通过Process.waitFor()直接调用python模块返回错误代码1的一种解决办法...
常见的java调用python脚本方式 通过jython提供的类库实现 通过Runtime.getRuntime()开启进程来执行脚本文件 通过jython提供的类库实现 通过jython实现的话,我 ...
- java process.waitfor();,正确的调用系统命令——为Process.waitFor设置超时以及其他 | 学步园...
Java中在阻塞调用系统命令的时候,一般是使用Runtime.getRuntime().exec(command)返回一个process对象,再调用Process.waitFor()来等待命令执行结束 ...
- Java process.waitFor() 卡死问题
在编写Java程序时,有时候我们需要调用其他的诸如exe,shell这样的程序或脚本.在Java中提供了两种方法来启动其他程序: (1) 使用Runtime的exec()方法 (2) 使用P ...
- java执行shell脚本 process.waitFor()返回1
记录一下今天遇到的一个问题 在java代码中执行shell脚本,部分代码如下 Process p = null; List<String> cmds = new ArrayList< ...
最新文章
- linux mysql清除数据库所有表_MySQL修复指定数据库下的所有表
- 10-03视图的优缺点及注意事项
- 剑指Offer #10 矩形覆盖(问题分析)
- [bzoj3879]SvT_后缀数组_RMQ_单调栈
- 发布新的个人博客地址和微信公众号
- Android的Touch系统简介(一)
- Tomcat7出现HTTP Status 500 - java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl cannot b
- 软件制胜之道精彩观点聚合
- 用户、话题、评论一网打尽,分享一个最强微博爬虫
- 读取文本作为输出字段
- Windows内核面试题(持续更新,目前完成度30%约1.8万字)
- 【小程序开发】—— 封装自定义弹窗组件
- 打印图像模糊问题解决方法
- python高并发编程_python 并发编程
- 自旋锁spin_lock和raw_spin_lock
- 密码学基础 上机实验4 ElGamal的Python实现(求解原根)
- 查看、修改git账号信息
- iphone微信小程序底部预留bar安全距离css
- apt查看安装包可用版本号
- “闪婚”的代价:亿晶光电控股权陷“罗生门”
热门文章
- linux nfs如何配置,Linux上的NFS如何配置?
- 利用递归、迭代解决斐波那契数列问题与汉诺塔难题
- php 标准输出到文件格式,php格式输出文件var_export函数实例
- C语言不用strcmp函数比较字符串大小
- 没有任何基础学编程从哪开始_没有任何的绘画基础,该怎么学绘画?
- access下如何配置两个vlan_【新华三】网络工程师 H3C如何配置VLAN-trunk 二层隔离技术...
- monostate 状态_为什么Borg模式比Python中的Singleton模式更好
- 安装hbas_非常详细的HBase的安装与配置
- Linux-软件包管理
- 快速理解mysql主从,主主备份原理及实践