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

2024-02-08 22:38

本文主要是介绍怎样判断子进程已经结束 process.waitFor();的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

2009年07月31日 14:38 来源:普索网

 

发表于: 2007-02-28 10:25:04 楼主 ProcessBuild.command(commend);
  Process   process=   ProcessBuild.start();

  //
  publi c   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:02 1楼 得分: 7 process.waitFor();
是个组塞方法,如果子进程没有结束,它是不会返回的,

等子进程结束了,程序自然会继续执行下去,

你要问什么?
发表于: 2007-02-28 10:45:12 2楼 得分: 0 就是他加了这句话它就不会结束了一直等下去
如果不加这句话等几一段时间它就完成了
发表于: 2007-02-28 11:10:05 3楼 得分: 0 你把子进程结束掉,他不就执行下去了么

"如果不加这句话等几一段时间它就完成了 "
这是什么意思?
发表于: 2007-02-28 11:17:00 4楼 得分: 0 我开的子进程是个转换视频格试的可执行程序 "ffmpeg.exe "
它转换一个文件完成大概要30秒,不加process.waitFor();的话它30秒后就完成了

我要先判断它的退出值是不是0如果是0的话就表示正常终止
但直接distory()的话可能还没有完成就终止了

我现实现的是子进程完成了通知一下
发表于: 2007-02-28 11:37:28 5楼 得分: 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:34 6楼 得分: 0 但如果我将WEB服务器停止时它就执行完成了
发表于: 2007-02-28 13:34:24 7楼 得分: 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:33 8楼 得分: 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:41 9楼 得分: 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();的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/692414

相关文章

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf