2012-02-18 51 views
7

爲什麼選擇幾個線程的幾個進程來實現Java應用程序?何時通過Java中的線程選擇多個進程?

我正在重構一個較老的java應用程序,它現在被分成幾個運行在同一個多核心機器上的小應用程序(進程),通過套接字相互通信。

我個人認爲這應該使用線程而不是進程來完成,但是哪些論據會捍衛原始設計?

回答

9

我(和其他人,見下面的歸屬),可以認爲有幾個原因的:

歷史原因

  • 設計是當只有綠色的線是可利用的和原來的日子作者/設計師認爲他們不會爲他工作。

魯棒性和容錯

  • 您使用的不是線程安全的組成部分,所以你不能並行withough訴諸多個進程。

  • 某些組件有問題,您不希望它們能夠影響多個進程。假設一個組件有內存或資源泄漏,最終可能會強制進程重啓,那麼只有使用該組件的進程會受到影響。

  • 正確的多線程仍然很難做到。取決於你的設計比多處理更難。然而,後者可以說也不是太容易。

  • 您可以擁有一個模型,讓您擁有一個可以主動監視(並最終重新啓動)崩潰的工作進程的看門狗進程。這也可能包括暫停/恢復進程,這對線程不安全(感謝@Jayan指出)。

OS資源限制&治理

  • 如果這個過程中,使用一個線程,已經使用所有可用的地址空間(例如,在Windows 2GB的32位應用程序),你可能需要在流程中分配工作。

  • 限制資源(CPU,內存等)的使用通常只能在每個進程的基礎上進行(例如在Windows上可以創建「作業」對象,這需要單獨的進程)。

安全考慮

  • 您可以運行使用不同的賬戶(即 「用戶」)不同的進程,從而爲他們提供更好的之間的隔離。

兼容性問題

  • 支持多個/不同的Java版本:使用不同的充過程中,你可以使用不同的Java版本,爲您的應用部分(如果需要通過第三方庫)。

位置透明

  • 你可以(可能)在多個物理機器分發您的應用程序,從而進一步提高了應用程序的可擴展性和/或魯棒性(參見@Qwe's answer /詳情最初的想法)。
+0

優秀列表或論點,謝謝! – wannabeartist 2012-02-18 08:59:30

+0

+1涵蓋我可能列出的所有內容。 (我會強調資源管理和特權分離項目;它們是你不可能在沒有單獨進程的情況下完成的工作,儘管有時候這些時間超出了分離虛擬機的範圍。​​) – 2012-02-18 09:04:40

+0

+1健壯性包括'容錯'就像一些進程啓動並觀察其他進程一樣(postgres做了一些類似的事情)。 – Jayan 2012-02-18 09:13:47

6

如果您決定使用線程,您將限制您的應用程序在單臺計算機上運行。此解決方案不會擴展(或在某種程度上擴展) - 總是存在硬件限制。

通過套接字進行通信的不同進程可以在機器之間分配,以便您可以添加幾乎無限的數量或它們。這可以在進程間通信緩慢的代價下更好地擴展。

確定哪種方法更適合本身是一項非常有趣的任務。一旦你做出決定,不能保證在需求改變或有新硬件可用時,在幾年後你的繼任者會看起來很愚蠢。

+0

非常真實。在這種情況下,應用程序應該始終在一臺機器上運行,但通常是一個非常有效的考慮點。 – wannabeartist 2012-02-18 09:01:19