问题描述
本人在开发中遇到通过Process类启动子进程的时候出现子进程一直阻塞,排查了子进程程序代码没有问题代码,然后偶然找到一个大佬写的博客才解决了此问题,需要单独启动一个新的线程接受子进程控制台的输出信息方可解决。
有问题的代码
public static void main(String[] args) throws Exception {
String osname = System.getProperty("os.name").toLowerCase();
StringBuilder command = new StringBuilder("java -Xms512M -Xmx512M -jar test.jar --server.port=8080 ");
Process process=null;
try {
if ( osname != null && osname.indexOf("linux") != -1) {
String[] cmdA = {"/bin/sh", "-c", command.toString()};
ProcessBuilder pb = new ProcessBuilder(cmdA);
process = pb.start();;
} else {
process = Runtime.getRuntime().exec(command.toString());
}
InputStreamReader isr = new InputStreamReader(process.getInputStream());
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println("INFO" + ">" + line);
}
process.waitFor();
}catch (InterruptedException e){
process.destroyForcibly();
}
}
能正常运行的代码
新建一个线程接受子进程控制台输出信息
public class StreamGobble extends Thread {
InputStream is;
String type;
public StreamGobble(InputStream is, String type) {
this.is = is;
this.type = type;
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(type + ">" + line);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
main函数代码
public static void main(String[] args) throws Exception {
String osname = System.getProperty("os.name").toLowerCase();
StringBuilder command = new StringBuilder("java -Xms512M -Xmx512M -jar test.jar --server.port=8080 ");
Process process=null;
try {
if ( osname != null && osname.indexOf("linux") != -1) {
String[] cmdA = {"/bin/sh", "-c", command.toString()};
ProcessBuilder pb = new ProcessBuilder(cmdA);
process = pb.start();;
} else {
process = Runtime.getRuntime().exec(command.toString());
}
new StreamGobble(process.getInputStream(), "INFO").start();
new StreamGobble(process.getErrorStream(), "ERROR").start();
process.waitFor();
}catch (InterruptedException e){
process.destroyForcibly();
}
}