Process的waitFor死锁问题及解决办法
一、问题概述
最近在项目开发中,遇到一个问题, java主线程使用Runtime.exec调用子线程执行shell脚本命令,子线程一直阻塞,而主线程调用process.waitfor()等待子线程返回执行结果,主线程迟迟等不到子线程的返回结果,程序一直阻塞。
示例代码如下:
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
@Slf4j
public class test {
/**
* 下载私服压缩包,通过sh在远程客户端安装
* @param serverIp 远程客户端ip
* @return
*/
private Boolean fileDownload( String serverIp){
try{
String installCmd = "sh downloadFileAndInstall.sh";
Runtime runtime =Runtime.getRuntime();
//调用子线程去执行shell脚本命令
Process process = runtime.exec(installCmd);
log.info("installCmd:"+installCmd);
InputStream pInputStream = process.getInputStream();
InputStream pErrStream = process.getErrorStream();
BufferedReader installReader = new BufferedReader(new InputStreamReader(pInputStream));
BufferedReader installErrReader = new BufferedReader(new InputStreamReader(pErrStream));
//主线程等待子线程返回结果,0表示正常结束
int exitValue = process.waitFor();
String line;
if(0==exitValue){
while((line=installReader.readLine())!=null){
log.info("download file :"+line)