概要
需求
首先我们需要同时运行多个相同的代码(代码中有单例),这个时候我们就想到了多个进程方式。 同时我们的这段代码又是阻塞的,于是又得借助多线程来实现。
整体架构流程
多进程
public class ProcessBuilderTest {
public static void main(String[] args) {
List<String> params = new ArrayList<String>();
params.add("java");
params.add("-jar");
params.add("ProcessJar.jar");
params.add("args1");
params.add("args2");
params.add("args3");
ProcessBuilder processBuilder = new ProcessBuilder(params);
// System.out.println(processBuilder.directory());
// System.out.println(processBuilder.environment());
processBuilder.redirectErrorStream(true);
try {
Process process = processBuilder.start();
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
int exitCode = process.waitFor();
System.out.println("exitCode = "+exitCode);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这种情况就可以执行在主进程中,执行ProcessJar.jar子进程了。
但这个时候如果,加个for循环多次执行,就会有问题。
主进程会以阻塞的方式执行 Process process = processBuilder.start(); 如果ProcessJar.jar里面的代码是阻塞的,那第二个ProcessJar.jar就不会执行
多线程
这段代码来自ChitGPT, CSDN还是挺牛逼,有自己的GPT了,方便
ProcessBuilder pb = new ProcessBuilder("command");
Thread t = new Thread(new Runnable() {
public void run() {
try {
pb.start();
} catch (IOException e) {
e.printStackTrace();
}
}
});
t.start();
这时把for循环加到Thread t = new Thread(new Runnable() {
外层后,就可以解决上面的问题了。
小结
主要知识点:
多进程:ProcessBuilder processBuilder = new ProcessBuilder(params);
多线程:Thread t = new Thread(new Runnable() {