2010-07-16 131 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[])的類的名稱。

相關問題