2011-06-07 168 views
23

假設我在同一臺機器上同時運行兩個java程序。這些程序是運行在單個JVM實例中,還是運行在兩個不同的JVM實例中?同時運行在同一個JVM上運行的java程序?

+1

他們可能共享dll,甚至編譯類(取決於實現和配置)。 – 2011-06-07 12:08:36

回答

22

如果您使用java命令(從命令行)啓動每個命令,它們將作爲完全獨立的JVMs運行。

「程序」可以作爲獨立的Threads在一個JVM中運行而啓動。

+0

它依賴於供應商,但對於標準的Oracle JVM for Windows/Linux/OS x – 2014-03-12 16:34:06

1

它依賴於平臺和JVM實現,但通常它們將運行在單獨的VM中。

1

假設你的意思是程序這個詞的過程,那麼是的,啓動兩個進程將創建兩個不同的JVM。

使用java應用程序啓動器啓動JVM進程;這應該爲您的程序提供一個入口點,這是主要方法。您可以鏈接到此入口點的其他類以及其他類。這將繼續發生在同一個JVM進程中,除非你啓動另一個進程(運行另一個程序)。

0

程序是運行在單個JVM實例中還是將運行在兩個不同的JVM實例中?

這取決於你。最簡單的方法是使用單獨的JVM。

0

你可以做的是使用兩個獨立的線程。對於exampe

new Thread() { 
    public void run() { 
    System.out.println("this is running separately from the main thread!"); 
    } 
}.start(); 

如果你想兩個獨立的程序進行交互,你需要使用套接字

13

java只需一次打開啓動一個應用程序,但你可以寫一個簡單的發射是採取類名稱作爲參數並在不同的線程中執行它們。快速概要:

public class Launcher { 
    public static void main(String[] args) throws Exception { 
    for (int i = 0; i<args.length; i++) { 
     final Class clazz = Class.forName(args[i]); 
     new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try{ 
      Method main = clazz.getMethod("main", String[].class); 
      main.invoke(null, new Object[]{}); 
      } catch(Exception e) { 
      // improper exception handling - just to keep it simple 
      } 
     } 
     }).start(); 
    } 
    } 
} 

調用它像

java -cp <classpath for all applications!> Launcher com.example.App1 com.example.App2 

應執行相同的虛擬機內部和並行應用程序App1和App2。

相關問題