本人项目中有个java程序(A),需要调用另一个shell script(B),在B中又去执行一个C++程序.out文件(C),如果C运行正常,会通过B向A传回一个返回码。现在的问题是C程序中如果存在死循环,B执行不完,A也拿不到返回码,程序没反应。现在希望在A程序中等待一段时间后如果没有返回直接结束进程,不知如何实现,望哪位高手指点一下,感激不尽。谢谢!
A程序中执行B采用的方法是:Process proc=Runtime.getRuntime().exec(cmd);  //调用这个shell script(B)
proc.waitFor(); 
rescode=proc.exitValue();

解决方案 »

  1.   

    写一个线程,过了一段时间如果A没结束就调用kill去杀死C或者B
      

  2.   

    kill不是linux下的命令吗?在java中怎么写呢?
      

  3.   

    Process proc=Runtime.getRuntime().exec(cmd); //跟这个写法一样
    用java调用kill
      

  4.   

    window下结束cmd进程的命令TASKKILL /F /IM cmd.exe /T
      

  5.   

    看到一句话:“当你在一个Process上调用waitFor方法时,当前线程是阻塞的,如果外部命令无法执行结束,那么你的线程就会一直阻塞下去,这种意外会影响我们程序的执行。所以在我们不能判断外部命令什么时候执行完毕而我们的程序还需要继续执行的情况下,我们就应该循环的使用exitValue来取得外部命令的返回状态,并在外部命令返回时作出相应的处理。 ”其中的“应该循环的使用exitValue来取得外部命令的返回状态,并在外部命令返回时作出相应的处理”怎么实现呢?
      

  6.   

    这样做其实并不好,就是在while(true)循环中不停地判断exitValue,根据exitValue来做相应的处理
    你在waitFor以前启动一个线程,并设置一个flag,线程等待一定时间,如果主线程执行waitFor结束则清空flag,线程到时间后判断flag,如果flag没有清空,说明主线程被卡住了,线程就调用kill去杀死B或C
      

  7.   

    谢谢楼上,最后用了这段程序:
    long start_time;
    start_time=System.currentTimeMillis();
    rescode=5;  
    while((System.currentTimeMillis()-start_time)<15000)
    {
      try
      {
        rescode=proc.exitValue();
        break;
      }
      catch(Exception e)
      {
      }
    }
    proc.destroy();基本上能实现功能,只是反应要比原来不用循环时慢了,这个循环真的会花费时间吗
      

  8.   

    后来用了这样的代码,时间稍微短了一些
    for(i=0;i<20;i++)
    {
    long start_time=System.currentTimeMillis();
    while((System.currentTimeMillis()-start_time)<500)
    {}
    try
    {
    rescode=proc.exitValue();
    break;
    }
    catch(Exception e)
    {
    }
    }