2009-07-01 144 views
3

如果我想在沒有同步的情況下在同一個jvm中運行多個進程(我不關心同時運行多個東西......我只想避免重新實例化jvm),什麼是最佳解決方案?jvm的多java進程?

啓動一個線程並加入等待,直到它死亡,然後創建另一個線程來完成另一個任務?

+1

你的意思是操作系統進程或線程形式的進程? – skaffman 2009-07-01 18:39:40

+0

我想包裝一個java程序運行幾次不同的參數,由另一個程序從文件中讀取這些參數... – LB40 2009-07-01 18:44:42

+0

如果你的字面意思是運行一系列任務,那麼爲什麼你需要一個線程?只要做好所有的工作。 而(moreWork){ gettask() dotask() } 我想我們還沒有明白了這個問題。請再說明一些。 – djna 2009-07-01 19:34:18

回答

0

Runtime.exec方法創建本機進程並返回Process的子類實例,該實例可用於控制進程並獲取有關該進程的信息。 Process類提供了執行進程輸入,執行輸出到進程,等待進程完成,檢查進程退出狀態以及銷燬(終止)進程的方法。

+0

哼,如果我使用ProcessBuilder或類似的東西,我是不是創建另一個jvm? – LB40 2009-07-01 18:37:22

+0

是的,你是...我會推薦它,但如果它是你想運行的其他Java應用程序,爲什麼不創建一個新線程並從那裏調用應用程序的main()? – Fredrik 2009-07-01 18:38:38

0

進程運行JVM; JVM不運行進程(雖然它們可以啓動進程,如前所述)。所以沒有辦法在同一個JVM下有多個進程。

1

您最好的標準解決方案是在應用程序服務器中運行/部署應用程序。這是假設您正在處理應用程序服務器的開銷不會掩蓋單個實例運行的優勢的應用程序。缺點是部署時間將會相當長。

如果您只是希望有更快速啓動的小型Java應用程序,那麼您的運氣幾乎不可靠。已經有幾次嘗試在實驗JVM中實現這一點。這個想法是,如果一個JVM正在運行,那麼將這個類的調用附加到這個正在運行的實例上,而不是盯着一個新的JVM。但據我所知,這些都沒有成功進入任何主流的JVM。

0

正如你所建議的,啓動一個線程並加入等待直到它死亡,它將會連續運行你的作業。我假設你只是想同時運行多個事物。只需啓動單獨的線程,通過創建新線程或Runnables即可。你只寫一個run()方法聲明,你希望你的線程並調用start():

public class T1 extends Thread { 
    public void run() { .. do something useful .. } 
} 

public class T2 extends Thread { ... yadda yadda } 

public static void main (String args[]) 
{ 
new T1().start(); 
new T2().start(); 
} 
3

您可以使用Ant Java task在同一個JVM上運行多個Java應用程序 - 只要確保fork參數設置爲false(默認值)。鏈接的幫助頁面提供了一些示例。

0

您可以A.)將該類添加到您的類路徑中,只需導入/運行應用程序 或者可能更符合您所尋找的內容,您可以使用Classloaders/Reflection來加載類並找到它的main(String [] args)方法就會調用它。

1

對我來說,問題在於,默認情況下,當你執行java應用程序時,你被一個入口點(即jar的Main-Class,或者你在java命令行指定的任何東西)卡住,然後jvm終止。如果您從BeanShell命令行運行進程,則可以手動調用任意數量的命令。

例如:

java -cp bsh-2.0b4.jar;yourapp.jar bsh.Console 

然後,

bsh % com.domain.prog.Mainclass.main(new String[] { }); 
4

提醒的JSR 121 Isolates我。該規範完成了,但我不確定什麼,如果有的話,曾經發生過這種東西的實施。還有一個followup JSR 284

0

你甚至都不需要線程按順序運行一些其他的Java程序:

public class RunPrograms { 

    public void main(args) { 
     <for each applicationClass and args> { 
     try { 
      applicationClass.main(args) 
     } catch Exception e { 
      // if you want the entire set to die if one dies, rethrow (or don't catch) 
      // otherwise somehow log the error and continue 
     } 
     } 
    } 
} 

你會遇到麻煩,如果任何程序調用System.exit(),但是這將是真正的爲使用任何系統單jvm。