日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 ShangShujie 2010-04-15

最近在java代碼中使用runtime.exec執(zhí)行rsync命令做同步,發(fā)現(xiàn)當(dāng)兩個目錄需要非常大同步工作的時候,rsync進程就 會一直阻塞。查看了jdk幫助,以及google都無果,于是打算把執(zhí)行的信息都log出來,結(jié)果執(zhí)行突然成功。仔細思考,這個問題應(yīng)該是進程執(zhí)行命令的 時候,輸出結(jié)果有個buffer,如果buffer已經(jīng)滿了,而沒有進程去讀,這個進程就會阻塞等待,導(dǎo)致我前面的問題出現(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)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多