我必须对java中的多线程和多进程架构之间的性能差异进行基准测试。这是我用来创建新流程的代码
for(int i=0;i<100;i++)
{
try {
Process p = Runtime.getRuntime().exec("java -jar myjar.jar " + input);
} catch (Exception e) {
System.out.println("Exception in creating process");
e.printStackTrace();
}
}
有没有办法知道我的主java程序启动的所有进程何时完成执行?
答案 0 :(得分:3)
是:请为每个流程调用waitFor:
for (Process p: processes) // you must save your Process references somewhere :)
p.waitFor();
如果p已经完成,则该方法返回inmediatly。如果不是,那就等了。
编辑:如果您需要同时执行其他操作,请在另一个线程中执行/ wait。当所有进程终止时,线程将结束循环,你可以做其他事情:
final List<Process> processes = new ArrayList<Process>();
// start processes
for (...) {
p = ...
processes.add(p);
}
// create and start "watchdog" thread
new Thread() {
public void run() {
for (p: processes)
p.waitFor();
// at this point all processes are terminated
}.start();
// ok, I've started the "watchdog" thread. now let's do fun stuff...
// do my stuff...
答案 1 :(得分:2)
查看Process.waitFor,它将一直阻塞,直到生成的子进程终止。
要使用它,您必须存储在某种集合中创建的所有Process
个对象,然后在调用waitFor
时循环遍历它们 - 但这并不太复杂。
答案 2 :(得分:0)
List<Process> processes = new ArrayList<Process>();
for (...) {
processes.add(Runtime.getRuntime().exec(...));
}
volatile int processesCount = processes.size();
for (Process p : processes) {
new Thread() {
public void run() {
p.waitFor();
processesCount --;
}
}.start();
}
while (processesCount !=0) {
//do nothing
}
//now all the processes were terminated.