1 需求
2 接口
3 示例
import java.io.IOException;
/**
* 现象:1输出后马上输出2
* 原因:子进程如果没有调用waitFor(),不会阻塞主进程
*/
public class Test {
public static void main(String[] args) {
System.out.println(1);
try {
Runtime.getRuntime().exec("ping www.baidu.com -n 100");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(2);
}
}
3 示例:
import java.io.IOException;
/**
* 现象:1输出后,命令执行完后,才会输出2
* 原因:子进程调用waitFor(),且没有设置等待时长,所以,只有命令执行完,才会输出2
*/
public class Test {
public static void main(String[] args) {
System.out.println(1);
try {
Process process = Runtime.getRuntime().exec("ping www.baidu.com -n 100");
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
System.out.println(2);
}
}
3 示例:
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* 现象:1输出后,等待10秒后,立刻输出2
* 原因:子进程调用waitFor(),且设置等待时长时:
* 如果命令执行时间小于设置等待时长,那么,命令执行完后,立刻输出2;
* 如果命令执行时长大于设置等待时长,那么,等待时长到时,立刻输出2;
*/
public class Test {
public static void main(String[] args) {
System.out.println(1);
try {
Process process = Runtime.getRuntime().exec("ping www.baidu.com -n 100");
process.waitFor(10, TimeUnit.SECONDS);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
System.out.println(2);
}
}
3 示例
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* 现象:1输出后,由于命令1秒就可以执行完成,不用等到10秒,1秒之后就立刻输出2
* 原因:子进程调用waitFor(),且设置等待时长时:
* 如果命令执行时间小于设置等待时长,那么,命令执行完后,立刻输出2;
* 如果命令执行时长大于设置等待时长,那么,等待时长到时,立刻输出2;
*/
public class Test {
public static void main(String[] args) {
System.out.println(1);
try {
Process process = Runtime.getRuntime().exec("ping www.baidu.com -n 1");
process.waitFor(10, TimeUnit.SECONDS);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
System.out.println(2);
}
}
3 示例:
import javax.rmi.PortableRemoteObject;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* 现象:1输出后,由于命令1秒就可以执行完成,不用等到10秒,1秒之后就立刻输出2
* 原因:当循环调用系统命令(如:反编译APK,调用jadx),如果被调用的命令并行数量有限制的话
* 如果调用waitFor,由于发送cmd命令很快,不管是否设置等待时长,会导致jadx进程激增,最终导致系统崩溃
* 只有调用Thread.sleep(),才可以控制jadx进程的数量
*/
public class Test {
public static void main(String[] args) {
System.out.println(1);
for (int i = 0; i < 100; i++) {
try {
Process process = Runtime.getRuntime().exec("cmd /c ping www.baidu.com -n 100");
// process.waitFor(10, TimeUnit.SECONDS);
// process.waitFor();
Thread.sleep(10);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(2);
}
}
3 示例:
结论:exitValue()是非阻塞的,在调用这个方法时,外部命令并没有返回,所以,引起异常。
import java.io.IOException;
public class Test {
public static void main(String[] args) {
System.out.println(1);
try {
Process process = Runtime.getRuntime().exec("cmd /c ping www.baidu.com -n 100");
System.out.println(process.exitValue());
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(2);
}
}
3 示例
import java.io.IOException;
public class Test {
public static void main(String[] args) {
System.out.println(1);
try {
Process process = Runtime.getRuntime().exec("javac");
System.out.println(process.waitFor());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
System.out.println(2);
}
}
3 示例
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args) {
System.out.println(1);
try {
Process process = Runtime.getRuntime().exec("javac");
InputStream inputStream = process.getErrorStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "GBK");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
while ((line=bufferedReader.readLine()) != null) {
System.out.println(line);
}
System.out.println(process.waitFor());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
System.out.println(2);
}
}