【问题标题】:ProcessBuilder - Start another process / JVM - HowTo?ProcessBuilder - 启动另一个进程 / JAVA - 如何?
【发布时间】:2010-07-16 08:27:47
【问题描述】:

我正在编写一个网络应用程序,其中每个客户端都有一个单例客户端管理器。 对于测试,我想创建几个客户端(每个客户端都在自己的虚拟机/进程中),而不需要手动启动程序 n 次。

关于 stackoverflow 的以下两个问题已经描述了如何做到这一点:

我的代码基于这些,但它不起作用:

  • 调用 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


    【解决方案1】:

    我建议您将 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. getCanonicalNamegetName 返回不同的名称。哪一个是对的?他们都错了。
    2. Main3 有效。

    【讨论】:

      【解决方案2】:

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

      要弄清楚为什么你的衍生进程没有启动,我建议打印出ProcessBuilder 构造函数的所有参数,并检查使用这些参数调用的手动调用的JVM 是否成功。特别是,您需要该类名是具有static void main(String[]) 的类的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        相关资源
        最近更新 更多