`
kanpiaoxue
  • 浏览: 1789844 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java runtime exec 运行挂起的问题

    博客分类:
  • java
 
阅读更多

我写了一个简单的oracle的备份系统,需要调用expdp和impdp命令。结果发现

int exitCode = Runtime.getRuntime().exec(cmd).waitFor();
if(0 == exitCode){
    // success
}else{
    //failure
}

 这样书写代码之后,晚上执行几千个表的备份的时候,有个数不定的expdp或impdp进程被挂死,不退出。

后来我发现很多人都遇到了类似的问题。解决方法如下:

 

http://blog.csdn.net/rogerjava/article/details/7006987

http://dhruba.name/2012/10/16/java-pitfall-how-to-prevent-runtime-getruntime-exec-from-hanging/

 

  1. public class TESTRuntime {  
  2.       
  3.     public String cmdexeStr = "exp test/test file=d:/daochu.dmp tables=(t_test)";  
  4.       
  5.     public String startRunTime(){  
  6.         try {  
  7.             Process proc = Runtime.getRuntime().exec(cmdexeStr);  
  8.             InputStream errorProcStream = proc.getErrorStream();  
  9.             InputStream outputProcStream = proc.getInputStream();  
  10.             InputStreamReader errorRead = new InputStreamReader(errorProcStream);  
  11.             InputStreamReader outputRead = new InputStreamReader(outputProcStream);  
  12.             BufferedReader errorbr = new BufferedReader(errorRead);  
  13.             String errorline = null;  
  14.                while ((errorline = errorbr.readLine()) != null) {  
  15.                    System.out.println("------error:/n"+errorline);  
  16.                }  
  17.             BufferedReader outputbr = new BufferedReader(outputRead);  
  18.             String outputline = null;  
  19.                while ((outputline = outputbr.readLine()) != null) {  
  20.                    System.out.println("------debug:/n"+outputline);  
  21.                }  
  22.             int num = proc.waitFor();  
  23.             System.out.println("------num:"+num);                          
  24.                         proc.destroy();   
  25.                      } catch (Exception e) {  
  26.             // TODO Auto-generated catch block  
  27.             e.printStackTrace();  
  28.         }  
  29.         return null;  
  30.     }  
  31.       
  32.     public static void main(String[] args) {   
  33.         System.out.println("------------start run--------------");  
  34.         TESTRuntime test = new TESTRuntime();  
  35.         test.startRunTime();  
  36.         System.out.println("------------end run--------------");  
  37.     }  
  38.   
  39. }  
分享到:
评论

相关推荐

    when Runtime.exec() won't 中文翻译版

    在Java编程中,`java.lang.Runtime` 类提供了与Java虚拟机的运行时环境交互的方法,其中`Runtime.exec()` 方法尤其受到开发者的青睐,因为它允许Java程序启动和控制外部进程。然而,尽管`Runtime.exec()` 功能强大,...

    深入研究java.lang.Runtime类.doc

    20. runFinalization():运行挂起 finalization 的所有对象的终止方法。 21. runFinalizersOnExit(value):已过时。 此方法本身具有不安全性。它可能对正在使用的对象调用终结方法,而其他线程正在操作这些对象,...

    java结束进程的实例代码

    应妥善处理这些输出,避免程序因未捕获的异常而挂起。 2. **进程管理**:执行的外部进程可能会创建子进程。如果需要确保所有相关进程都被结束,可能需要使用更复杂的逻辑来跟踪和终止它们。 3. **权限问题**:终止...

    java问题定位技术+性能优化

    - 检查是否有线程被意外地挂起或等待。 - **1.3.6 多个锁导致的锁链分析** - 分析线程堆栈中的锁信息,找出可能存在的锁链顺序问题。 - 调整代码逻辑,尽可能减少锁的竞争。 - **1.3.7 通过线程堆栈进行性能瓶颈...

    关于过大的占用内存的方法1

    在标题和描述中提到的问题是关于如何正确地使用`Runtime.getRuntime().exec()`方法来避免内存占用过大或导致程序挂起的情况。这个问题的核心在于理解和处理子进程的输入、输出和错误流。 首先,我们来看一下原始的`...

    android定时关机,重启

    如果要执行关机命令,可以将"reboot"替换为"shutdown -h now",这里的"-h"表示挂起,"now"表示立即执行。 2. **使用ProcessBuilder类执行命令** ```java ProcessBuilder pb = new ProcessBuilder("su", "-c", ...

    结束进程服务_源代码

    - 在Java中,可以使用Runtime类的exec方法执行系统命令,或者使用java.lang.ProcessBuilder和java.lang.Process类来控制进程。 - Python中,可以使用os模块的os.kill()或subprocess模块来结束进程。 4. **安全与...

    android reboot 重启

    它首先同步所有挂起的操作,然后根据传入的原因选择合适的重启模式。 4. **注意事项**: - 使用API接口重启时,需要注意不同版本的Android系统可能存在差异,因此在实际开发中应考虑兼容性问题。 - 调用API接口...

Global site tag (gtag.js) - Google Analytics