怎样判断子进程已经结束 process.waitFor();的问题

2009年07月31日 14:38 来源:普索网
发表于:2007-02-28 10:25:04 楼主 ProcessBuild.command(commend);
  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();的问题相关推荐

  1. Process#waitFor()阻塞问题

         有时需要在程序中调用可执行程序或脚本命令: Process process = Runtime.getRuntime().exec(shPath); int exitCode = proce ...

  2. java Process.waitFor阻塞

    关于java Process waitFor() 进程阻塞问题 摘录自:http://lelglin.iteye.com/blog/1487351 问题:有同学遇到java调用Process.exec ...

  3. java 使用Process调用exe程序 及 Process.waitFor() 死锁问题了解和解决

    前言 最近在开发android的同时也在开发java ,碰到了需要使用java 程序调用exe的需求,这里我使用的 process 来调用的.该篇文章 读完需要8+分钟,文章类型为 小白入门类型,此处 ...

  4. 为Process.waitFor设置超时

    2019独角兽企业重金招聘Python工程师标准>>> Java中在使用Runtime.getRuntime().exec(command)调用系统命令后 一般会调用Process. ...

  5. Java Process.exitValue Process.waitFor()

    http://gohands.blogbus.com/logs/172834178.html Process.exitValue() 采用非阻塞的方式返回,如果没有立即拿到返回值,则抛出异常 Proc ...

  6. java执行python返回null_[转]java调用python脚本以及通过Process.waitFor()直接调用python模块返回错误代码1的一种解决办法...

    常见的java调用python脚本方式 通过jython提供的类库实现 通过Runtime.getRuntime()开启进程来执行脚本文件 通过jython提供的类库实现 通过jython实现的话,我 ...

  7. java process.waitfor();,正确的调用系统命令——为Process.waitFor设置超时以及其他 | 学步园...

    Java中在阻塞调用系统命令的时候,一般是使用Runtime.getRuntime().exec(command)返回一个process对象,再调用Process.waitFor()来等待命令执行结束 ...

  8. Java process.waitFor() 卡死问题

    在编写Java程序时,有时候我们需要调用其他的诸如exe,shell这样的程序或脚本.在Java中提供了两种方法来启动其他程序: (1) 使用Runtime的exec()方法      (2) 使用P ...

  9. java执行shell脚本 process.waitFor()返回1

    记录一下今天遇到的一个问题 在java代码中执行shell脚本,部分代码如下 Process p = null; List<String> cmds = new ArrayList< ...

最新文章

  1. linux mysql清除数据库所有表_MySQL修复指定数据库下的所有表
  2. 10-03视图的优缺点及注意事项
  3. 剑指Offer #10 矩形覆盖(问题分析)
  4. [bzoj3879]SvT_后缀数组_RMQ_单调栈
  5. 发布新的个人博客地址和微信公众号
  6. Android的Touch系统简介(一)
  7. Tomcat7出现HTTP Status 500 - java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl cannot b
  8. 软件制胜之道精彩观点聚合
  9. 用户、话题、评论一网打尽,分享一个最强微博爬虫
  10. 读取文本作为输出字段
  11. Windows内核面试题(持续更新,目前完成度30%约1.8万字)
  12. 【小程序开发】—— 封装自定义弹窗组件
  13. 打印图像模糊问题解决方法
  14. python高并发编程_python 并发编程
  15. 自旋锁spin_lock和raw_spin_lock
  16. 密码学基础 上机实验4 ElGamal的Python实现(求解原根)
  17. 查看、修改git账号信息
  18. iphone微信小程序底部预留bar安全距离css
  19. apt查看安装包可用版本号
  20. “闪婚”的代价:亿晶光电控股权陷“罗生门”

热门文章

  1. linux nfs如何配置,Linux上的NFS如何配置?
  2. 利用递归、迭代解决斐波那契数列问题与汉诺塔难题
  3. php 标准输出到文件格式,php格式输出文件var_export函数实例
  4. C语言不用strcmp函数比较字符串大小
  5. 没有任何基础学编程从哪开始_没有任何的绘画基础,该怎么学绘画?
  6. access下如何配置两个vlan_【新华三】网络工程师 H3C如何配置VLAN-trunk 二层隔离技术...
  7. monostate 状态_为什么Borg模式比Python中的Singleton模式更好
  8. 安装hbas_非常详细的HBase的安装与配置
  9. Linux-软件包管理
  10. 快速理解mysql主从,主主备份原理及实践