2010-07-16 134 views
3

我在写一个网络应用程序,每个客户端都有一个Singleton ClientManager。 对于测试,我想创建几个客户端(每个在他们自己的虚拟机/进程),而无需手工启动程序n次。ProcessBuilder - 启动另一个进程/ JVM - HowTo?

上计算器下面两个问题已经描述了如何-做到这一点:

我的代码是基于这些,但它不工作:

  • 调用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"); 
    } 
} 

我在做什么错???

BTW:

  • 我使用Eclipse。
  • 单例问题是一个简化的的例子。请做不是建议创建一个工厂。

解决方案: HelloWorld2不能是内部类。

回答

2

我建议你让HelloWorld2成为顶级课程。看起来java期望一个顶级的类。

这是我试过的代码。

class Main 
{ 
    static class Main2 
    { 
     public static void main (String [ ] args) 
     { 
      System . out . println ("YES!!!!!!!!!!!") ; 
     } 
    } 

    public static void main (String [ ] args) 
    { 
     System . out . println (Main2 . class . getCanonicalName ()) ; 
     System . out . println (Main2 . class . getName ()) ; 
    } 
} 

class Main3 
{ 
    public static void main (String [ ] args) 
    { 
     System . out . println ("YES!!!!!!!!!!!") ; 
    } 
} 
  1. 另一方面,getCanonicalName的getName返回不同的名称。哪一个是对的?他们都错了。
  2. Main3作品。
1

我想我看到了部分问题的修复:process.waitFor()防止控制在子进程结束前返回到main()。

要找出生成的进程没有启动的原因,建议将所有参数打印到ProcessBuilder构造函数中,并检查使用这些参数调用的手动JVM是否成功。特别是,您需要该类名称作为具有static void main(String[])的类的名称。

相关问题