分享

runtime.exec()执行进程block死锁问题 - fuliang - JavaEye技术网站

 ShangShujie 2010-04-15

最近在java代码中使用runtime.exec执行rsync命令做同步,发现当两个目录需要非常大同步工作的时候,rsync进程就 会一直阻塞。查看了jdk帮助,以及google都无果,于是打算把执行的信息都log出来,结果执行突然成功。仔细思考,这个问题应该是进程执行命令的 时候,输出结果有个buffer,如果buffer已经满了,而没有进程去读,这个进程就会阻塞等待,导致我前面的问题出现。

效果可以通过如下代码说明:

Java代码
  1. import java.io.*;  
  2.   
  3. public class Rsync{  
  4.     public static void main(String[] args) throws Exception{  
  5.         if(args.length != 2){  
  6.             System.out.println("Usage: java Rsync src des");  
  7.             return;  
  8.         }  
  9.         Process proc = Runtime.getRuntime().exec("rsync -v -r -e --progress ssh -t -C " + args[0] + " " + args[1]);  
  10.         System.out.println("Waiting for end...");  
  11.         BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));  
  12.         String line = null;  
  13.         while((line = br.readLine()) != null){  
  14.             System.out.println(line);  
  15.         }  
  16.         br.close();  
  17.                 int exitValue = 0;  
  18.         if((exitValue = proc.waitFor()) != 0){  
  19.             System.out.println("exitValue:" + exitValue);  
  20.         }  
  21.         System.out.println("rsync complete!");  
  22.     }  
  23. }  
 

如果注释掉:

Java代码
  1.     BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));  
  2. String line = null;  
  3. while((line = br.readLine()) != null){  
  4.     System.out.println(line);  
  5. }  
  6. br.close();  

 在两个目录需要大量的同步操作时就会一直blocked住。

所以如果你不需要执行命令的输出,最好直接将输出重定向到 > /dev/nll

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多