Process process=Runtime.getRuntime().exec("");中产生停滞(阻塞,blocking),怎么解决?

muiz 2004-07-12 08:50:52
Process process=Runtime.getRuntime().exec("");中产生停滞(阻塞,blocking),怎么解决?
我在Tomcate中运行了一个外部指令,这个指令有多个参数。我用上面的方法调用这个指令,部分代码如下:
Process process=Runtime.getRuntime().exec("growisofs -Z /dev/scd0 -R -J /data/pgdata");
BufferedReader inputBufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream()));
while(inputBufferedReader.ready())
{
System.out.println(inputBufferedReader.readLine());
}
process.waitFor();
上面的指令是刻录光盘,然后刻完后弹出光盘。可是运行的时候就在while这边停掉了,实际上是光盘刻录完成了,但没有弹出光盘。当我把Tomcate关闭后才会弹出光盘。
还有一种情况是当/data/pgdata目录下的文件大小比较小是,比如700MB,就没有问题,当大小是1.5G的时候就会有这种情况。
请问这种情况有什么好的解决方法?
...全文
1249 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hillMover 2005-03-23
  • 打赏
  • 举报
回复
mark!
muiz 2004-09-20
  • 打赏
  • 举报
回复
可以了。
1. 用 j2sdk-1_4_2_05-linux-i586
1. 修改代码。(参见http://community.csdn.net/Expert/topic/3225/3225349.xml?temp=.0577814 中 takecare(大厅) 具的)
takecare 2004-09-10
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3225/3225349.xml?temp=.0577814
muiz 2004-09-10
  • 打赏
  • 举报
回复
To: takecare(大厅) ( )
你能讲得详细一点吗? 最好能具一个例子。谢谢了先
takecare 2004-09-09
  • 打赏
  • 举报
回复
这个是因为Runtime.getRuntime().exec()要自己去处理stdout和stderr的。
所以如果你想让程序正常运行的话,请务必将上述用别的线程流取走。
muiz 2004-07-14
  • 打赏
  • 举报
回复
是的。好是麻烦!
如果是用JNI就太麻烦了。
cloudysunny 2004-07-13
  • 打赏
  • 举报
回复
如果判断条件用楼主你的ready()的话就会由于那个process还没开始,所以根本不会读取到信息,就马上到达process.waitFor()语句。
不过比较奇怪的是,在这里会阻塞,除非用上面的方法把输出都读取出来。
cloudysunny 2004-07-13
  • 打赏
  • 举报
回复
Process process=Runtime.getRuntime().exec("cmd /c dir c:");
System.out.println("tt");
BufferedReader inputBufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while((line = inputBufferedReader.readLine()) != null)
{
System.out.println(line);
}
process.waitFor();
System.out.println("tt2");
ningIII 2004-07-13
  • 打赏
  • 举报
回复
哈哈,我也遇到过这种问题!

不过我是在weblogic下运行oracle的命令,结果有时就卡死,直到我把weblogic关掉才继续!

后来也没彻底解决,只不过在系统、应用服务器和程序都正常时不应该会这样!

但你的问题是process.waitFor();

这句的意思是
causes the current thread to wait, if necessary, until the process represented by this Process object has terminated. This method returns immediately if the subprocess has already terminated. If the subprocess has not yet terminated, the calling thread will be blocked until the subprocess exits.
当它的子进程结束以后再继续,但是对于这种外部命令,我们根本就没取到子进程的句柄。换句话说其实这是两个并行的进程,不存在继承关系!

去掉那一句应该就好了!
muiz 2004-07-13
  • 打赏
  • 举报
回复
在命令行的话,键入命令:growisofs -Z /dev/scd0 -R -J /data/pgdata
会输出一些growisofs命令运行的一些信息,比如完成%之几等,这些信息可以用process.getInputStream()和process.getErrorStream()得到。
ningIII 2004-07-13
  • 打赏
  • 举报
回复
赫赫,写错了

是inputBufferedReader.readLine()==null
muiz 2004-07-13
  • 打赏
  • 举报
回复
To: cloudysunny(蓝天下的雨云)
我在命令行中运行命令一切都正常的。
我的调用到底死掉没有也不知道,进程就是停在那儿了,很久了都没有反应。但停掉Tomcate后就会继续下去(弹出光盘)。

To:ningIII(小宁)
您是指 InputBufferedReader.read()==-1吧?
ningIII 2004-07-13
  • 打赏
  • 举报
回复
这和你的break;似乎没有关系!

只不过你不加的话程序将在inputBufferedReader.readLine()==-1时异常跳出!

cloudysunny 2004-07-13
  • 打赏
  • 举报
回复
你在命令行模式下运行“growisofs -Z /dev/scd0 -R -J /data/pgdata”会自动退出吗?如果可以那么你的调用就不会死掉,如果需要人工干预的话,你的进程就会阻塞在那里。
muiz 2004-07-13
  • 打赏
  • 举报
回复
但是我如果我不加 break;行,进程就会停在那儿的。而且如果出错了呢?那也是不可以预测的。
ningIII 2004-07-13
  • 打赏
  • 举报
回复
BufferedReader inputBufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream()));
while(inputBufferedReader.ready())
{

if(errorStr.indexOf(this.dev+": flushing cache")>=0)
{
//process.destroy();
break;
}(inputBufferedReader.readLine());


“this.dev+": flushing cache"”是结束时的输出吧??

赫赫,这就对了阿!

简单点说,读一个进程的输出,
BufferedReader inputBufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream()));

它会把所有输出都获得以后才返回,也就是说等你的进程结束以后它才会做完!所以不必担心要判断外部进程结束的标志!
muiz 2004-07-13
  • 打赏
  • 举报
回复
To: ningIII(小宁),我是去掉process.waitFor()这一句了,
由于要等到外部进程完成后才能继续,所以还要实现waitFor()功能。

BufferedReader inputBufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream()));
while(inputBufferedReader.ready())
{
System.out.println(inputBufferedReader.readLine());
}
就可以达到等待的功能(所以后面加上process.waitFor()就没有什么用了)。
但是刻录的数据比较大的时候,比如有2GB(即刻录的时间比较长),系统就会出现上面的问题,很奇怪,更奇怪的是我加上下面两行代码就没有问题了(至少是在刻录1.5GB的时候没有问题,原来是不可以的)

BufferedReader inputBufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream()));
while(inputBufferedReader.ready())
{

if(errorStr.indexOf(this.dev+": flushing cache")>=0)
{
//process.destroy();
break;
}(inputBufferedReader.readLine());
}

上面这一句“this.dev+": flushing cache"”是刻录结束的最后输出的一句话,我本想用process.destroy()停止这个进程的,可是不用就退出来了。奇怪。不直到刻录4GB的时候是什么样子。
muiz 2004-07-12
  • 打赏
  • 举报
回复
Who can help me???????????????????
launch401 2004-07-12
  • 打赏
  • 举报
回复
如果在命令行运行是什么输出?
muiz 2004-07-12
  • 打赏
  • 举报
回复
Ding

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧