【发布时间】:2010-07-16 08:27:47
【问题描述】:
我正在编写一个网络应用程序,其中每个客户端都有一个单例客户端管理器。 对于测试,我想创建几个客户端(每个客户端都在自己的虚拟机/进程中),而不需要手动启动程序 n 次。
关于 stackoverflow 的以下两个问题已经描述了如何做到这一点:
- Is this really the best way to start a second JVM from Java code?
- Java: Executing a Java application in a separate process
我的代码基于这些,但它不起作用:
- 调用 spawn 后主程序不会继续。
- 生成的代码没有被执行。
这是使用ProcessBuilder的完整代码:
public class NewVM {
static class HelloWorld2 {
public static void main(String[] args) {
System.out.println("Hello World");
System.err.println("Hello World 2");
}
}
public static void main(String[] args) throws Exception {
startSecondJVM(HelloWorld2.class, true);
startSecondJVM(HelloWorld2.class, false);
System.out.println("Main");
}
public static void startSecondJVM(Class<? extends Object> clazz, boolean redirectStream) throws Exception {
System.out.println(clazz.getCanonicalName());
String separator = System.getProperty("file.separator");
String classpath = System.getProperty("java.class.path");
String path = System.getProperty("java.home")
+ separator + "bin" + separator + "java";
ProcessBuilder processBuilder =
new ProcessBuilder(path, "-cp",
classpath,
clazz.getCanonicalName());
processBuilder.redirectErrorStream(redirectStream);
Process process = processBuilder.start();
process.waitFor();
System.out.println("Fin");
}
}
我做错了什么???
顺便说一句:
- 我正在使用 Eclipse。
- 单例问题是一个简化的例子。请不建议创建工厂。
解决方案: HelloWorld2 不能是内部类。
【问题讨论】:
标签: java testing process jvm fork