小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

runtime.exec()執(zhí)行進程block死鎖問題 - fuliang - JavaEye技術網(wǎng)站

 ShangShujie 2010-04-15

最近在java代碼中使用runtime.exec執(zhí)行rsync命令做同步,發(fā)現(xiàn)當兩個目錄需要非常大同步工作的時候,rsync進程就 會一直阻塞。查看了jdk幫助,以及google都無果,于是打算把執(zhí)行的信息都log出來,結果執(zhí)行突然成功。仔細思考,這個問題應該是進程執(zhí)行命令的 時候,輸出結果有個buffer,如果buffer已經(jīng)滿了,而沒有進程去讀,這個進程就會阻塞等待,導致我前面的問題出現(xiàn)。

效果可以通過如下代碼說明:

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住。

所以如果你不需要執(zhí)行命令的輸出,最好直接將輸出重定向到 > /dev/nll

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多