2013-08-29 50 views
0

我有java的CDE是罐子類文件一起:運行jar.exe的,process.waitFor有去無回

List<String> args = new ArrayList<String>(); 
    String path = FileSystemUtils.JavaBin() + "\\jar.exe"; 
    args.add(path); 
    args.add("-cfv"); 
    args.add(jarName); 
    args.addAll(FileSystemUtils.getAllFiles(directory, ".class")); 
    ProcessBuilder pb = new ProcessBuilder(args); 
    File wd = new File(directory); 
    pb.directory(wd); 
    Process p = pb.start(); 
    //Waiting for process to exit 
    p.waitFor(); 
    int res = p.exitValue(); 

提斯代碼的偉大工程。 但是,在某些計算機上(而不是所有計算機上),當有7個以上的文件時,即使創建了jar,p.waitFor();也不會返回。

看着任務管理器,jar.exe確實沒有終止....可能是什麼原因?從命令行手動運行相同的命令的 立即退出。

這似乎很奇怪。有人有任何提示嗎?

回答

0

我自己找到了解決方案。 顯然,如果您在Java中使用ProcessBuilder.start來啓動外部進程,則必須使用stdout/stderr,否則外部進程將掛起。

這是beacuase OS創建管道。 所有的Unix操作系統,如操作系統和Windows,在這方面都表現出相同的效果:在父級和子級之間創建了一個4K管道。當管道充滿時(因爲一邊沒有讀取),寫入過程被阻塞。

看來,如果有7個以上的文件jar.exe消耗4K,然後卡住了。

的Javadoc過程:

默認情況下,創建的子進程沒有自己的終端或 控制檯。它的所有標準I/O(即標準輸入,標準輸出,標準錯誤)操作 將被重定向到父進程,可以通過使用方法getOutputStream(), getInputStream()和getErrorStream()獲得的流訪問 。 。父進程使用這些 流將輸入提供給子進程並從子進程獲取輸出。由於 某些本機平臺僅爲標準的 輸入和輸出流提供有限的緩衝區大小,未能及時寫入輸入流 或讀取子流程的輸出流可能導致子流程 阻塞甚至死鎖。