runtime.exec()执行进程block死锁问题

本文探讨了在Java中使用Runtime.exec执行rsync命令时遇到的阻塞问题,并通过读取输出流解决了该问题。文章提供了示例代码,解释了缓冲区满导致进程阻塞的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

import java.io.*;

public class Rsync{
	public static void main(String[] args) throws Exception{
		if(args.length != 2){
			System.out.println("Usage: java Rsync src des");
			return;
		}
		Process proc = Runtime.getRuntime().exec("rsync -v -r -e --progress ssh -t -C " + args[0] + " " + args[1]);
		System.out.println("Waiting for end...");
		BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
		String line = null;
		while((line = br.readLine()) != null){
			System.out.println(line);
		}
		br.close();
                int exitValue = 0;
		if((exitValue = proc.waitFor()) != 0){
			System.out.println("exitValue:" + exitValue);
		}
		System.out.println("rsync complete!");
	}
}
 

如果注释掉:

      BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
		String line = null;
		while((line = br.readLine()) != null){
			System.out.println(line);
		}
		br.close();

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值