2010-10-11 157 views
4

我想從我自己的Java應用程序執行一個jar。 (不可能將這個jar導入到一個庫中,然後啓動該應用程序作爲我自己的「啓動器」的一個實例)。從我自己的Java應用程序執行jar ...我使用的是下一行:「Runtime.getRuntime()。exec()」的性能不佳嗎?

String [] cmd = new String [] {"java","-jar","myjar.jar"}; 
Process process = Runtime.getRuntime().exec(cmd, null, null); 

這完美的作品。我沒有抱怨這件事。

我的問題是這樣的:它是否具有與在命令行中通過「java -jar myjar.jar」執行該jar相同的性能?還是更糟?如果更糟......我可以用同樣的表現來做這件事嗎?

回答

3

表現本質上是一樣的,因爲在這兩種情況下基本上都是相同的事情。例如,在UNIX/Linux平臺上:

  • 當前進程爲'分叉'。
  • 新的子進程'exec''java'命令,傳遞指定的命令行參數。
  • 孩子JVM啓動...

有可能是繼發的性能差異。例如,以孩子的標準輸入/輸出/錯誤流得到父母處理的方式可能會有所不同。但通常你可以忘記這種事情。

[作爲@Amadan音符,用一個類加載器來啓動在目前的JVM的Java應用程序是有效的多...因爲它避免了JVM啓動,公共代碼的JIT編譯等,但主要的開銷缺點(除簡單性外)是沒有有效的方法讓「父」應用程序控制在同一個JVM中運行的「子」應用程序。如果孩子被困在一個循環中,或者資源管理通常是sl,不樂,父母也會受到影響。]

1

這是相同。

執行一個進程正在執行一個進程,無論命令處理器執行了它還是您的應用程序。

+1

你能給我一個簡短的解釋或參考嗎?謝謝! – testk 2010-10-12 00:00:41

+1

我確認,這是*相同*。效率較低,但比通過'ClassLoader'更容易。 – Amadan 2010-10-12 00:07:55

1

通過這種方式它是相同的。使用新的api ProcessBuilder,它有更好的方式來指定參數..

相關問題