2012-10-07 94 views
3

如果我有3個任務要同時運行所有這些任務,現在有兩種方法我正在考慮。Java多線程與Shell腳本

由於我在linux中運行程序,我可以在shell腳本中執行它。

java Task1 & 
    java Task2 & 
    java Task3 & 

或者,我可以用一個java程序產卵三個子線程完成的任務。

我想知道哪種方式更有效率。我懷疑shell的方式會創建多個JVM實例嗎?

+7

當然,shell腳本將創建多個JVM實例 - 這就是您要求它執行的操作。如果你試圖完成的任務是獨立的(它們不需要相互通信),shell腳本是最簡單的方法(也是最有意義的方法)。 – Cubic

+1

至於效率更高,它取決於你的意思是有效的 - 更少的內存使用,交換空間,執行時間,磁盤訪問,編程時間,安全等....還有代碼的作用 – Mark

+0

只要記住,如果你這樣做在一個JVM中有多個線程,你將擁有靜態變量,並且像線程之間共享的那樣。不知道你的應用程序,我不能說這是否會成爲一個問題,但這是你需要考慮的。如果你有三個單獨的JVM,那麼每個JVM都有它自己的靜態變量。 –

回答

2

如果任務運行了很長的時間,三個JVM中的開銷可以忽略不計:

  • 加載次/磁盤訪問是沒有問題,由於文件系統緩存。
  • 共享庫內存在Linux內核中是單例的。我假設Java使用每線程垃圾收集器,與三個JVM(除了最小的JVM元數據內存)相比,它們導致爲三個線程分配相同數量的默認內存。
  • 這也是一個衆所周知的事實,即Linux在進程調度中非常高效,使守護進程的獨立分支至少與多線程一樣高效。在Windows下,我們有一個不同的情況,即流程實例化是一個昂貴的操作。

很長一段時間我指的是每個任務30秒。現在短期任務呢?如果任務經常重複,那麼時間效率只是非常重要的。 (重新)加載JVM的重複運行的開銷要小得多,但總有一些將會停留。

結論:使用shell腳本更容易實現,編寫和維護的代碼更少,而且不需要編寫更多的代碼就可以進行更多的配置。在運行期間,在一種常見的情況下,您會發現兩種方法之間沒有很大的差異。

4

在Java中這樣做會更有效率,使您的程序爲多線程並使用三個線程。是的,shell方法會創建三個JVM實例。

但問題是,爲什麼你應該考慮一種替代方案?如果這只是一個小任務,我個人會像你一樣簡單地在shell中啓動三個實例。

+2

編程可能需要更長的時間,而且更容易出錯,這可能是他們測量效率的方式。 – Mark

0

你現在正在做的方式現在啓動三個單獨的JVM實例,每個JVM實例專用於一個任務。如果您想要在一個JVM上一致地運行所有三個任務,則需要爲它們創建Thread對象。

所以,我會創建一個非常簡單的Java程序,它將在各自的線程中啓動這些任務。然後,我會將該程序轉換爲.jar文件並安排執行。

+0

如果你甚至不知道他到底想做什麼,你怎麼知道你會如何解決這個問題?對於我們所知道的,他可以嘗試與數獨客戶端一起運行http服務器。 – Cubic

+1

@Cubic他爲這兩個人之間的差異而興奮,我試着回答。其餘的由他自己決定。或者如果問題仍然不清楚,他可以編輯問題或問問新問題。 –

0

更多的JVM更多的CPU時間。由於一個JVM上的三個線程會更好。但是做一個簡單的基準測試是值得的。如果你這樣做,請與我們分享。

0

我想知道哪種方式更有效。

如果只是限制你的標準,決定處理器的效率,在Java線程的方法是最有可能更高效。根據JVM啓動和內存利用率運行額外JVM的開銷將很可觀。

多線程版本可能較慢的唯一方案涉及某些資源的任務之間的競爭或較差的JVM優化選項選擇;例如如果你讓堆太小。

不過,我不認爲對處理器效能的理由純粹決定是明智的:

  • 如果任務長時間運行,你必須爲3級的JVM,性能差異(足夠的內存以百分比計)可能不重要。 (如果整個運行需要10個小時,你需要花10秒鐘的時間來啓動JVM)

  • 你還需要考慮開發時間,測試和維護。您的思考需要考慮編寫健壯的多線程應用程序的潛在複雜性。 (我不能預測,如果沒有您的系統的功能性和非功能性需求的更多細節。)

總之,有沒有你的問題的更多細節沒有很好的明確的答案,等


我懷疑shell的方式會創建多個JVM實例嗎?

錯誤。它創建多個JVM實例。