关于Java Process 阻塞的问题

Runtime.getRuntime().exec(cmds, envp, null);

suProc = Runtime.getRuntime().exec(cmds, envp, null);


proc.exitValue()是非阻塞的,如果进程没有结束,就会抛出异常。解决办法是循环等待命令退出

		while(true){
			try {
				int  exitValue=proc.exitValue();
				return exitValue;
			} catch (Exception e) {
				Thread.currentThread().sleep(500);
			}
		}

如果调用子进程结束,系统将关闭输出流和错误流。用户程序通过判断是否为-1知道是否结束

但是java调用cli时,cli启动了子进程,子进程为dhcp的客户端守护进程,负责与dhcp服务器通信,这个子进程不关闭,所以父进程也不关闭,造成系统不能关闭输出流和错误流,最后java线程阻塞。

解决办法是和相关人员确定一个特殊结束字符字符,我们这个特殊字符为转化为int后为:165

	private static String loadErrorStream(Process proc) throws IOException {

		InputStream in = new BufferedInputStream(proc.getErrorStream());
		StringBuffer buffer = new StringBuffer();
		int ptr = 0;
		while ((ptr = in.read()) != 165 ){
			buffer.append((char) ptr);
		}

		return buffer.toString();
	}

另一种场景:

调用的命令,需要执行20分钟,不想等待,要立即返回。

那么可以异步执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值