2012-07-09 85 views
2

我有一個Java應用程序與遠程主機創建SSL套接字。我想用線程來加速這個過程。如何決定在java中創建合適的線程數量?

我希望不影響程序性能的最大可能利用率。我怎樣才能決定合適的線程數量?運行以下行後:Runtime.getRuntime().availableProcessors();我得到了4.我的處理器是英特爾核心i7,具有8 GB RAM。

+4

使用線程池。 – DarthVader 2012-07-09 22:09:16

+1

@DarthVader我認爲問題是:什麼大小? – assylias 2012-07-09 22:10:50

+2

@DarthVader:我已經在使用池。但是我應該在池中定義多少個線程?我怎麼知道哪個號碼適合我的電腦? – 2012-07-09 22:12:29

回答

1

如果您有4個內核,那麼從理論上講,您應該在任何給定時間都有四個工作線程進行最大限度的優化。不幸的是理論上發生的事情在實踐中從未發生您可能有工人線程,無論出於何種原因,他們都有大量的停機時間。也許他們正在網上尋找更多的數據,或者從磁盤讀取數據,其中很多數據只是在等待而不使用cpu。

根據你在做多少等待,你會想要提高數字。增加線程數量的成本是您將有更多的上下文切換和資源競爭。好處是你將有另一個線程準備好工作,以防其他線程決定必須爲某些事情做出決定。

最好的辦法是把它設置成某種東西(讓我們從4開始),然後繼續前進。使用各種設置對您的代碼進行分析,然後查看您的基準測試結果是否升高或降低。你應該很快看到一個模式和盈虧平衡點。

當談到優化,可以推論所有你想了解應該是最快的,但你不會打實際運行和定時代碼,以真正回答這個問題。

+0

...你應該有**至少**四個工作者線程... – assylias 2012-07-09 22:19:49

+1

@assylias我不同意這一點。理論上的最大值是每個核心只有一個線程在運行。我會更新以澄清區別。 – corsiKa 2012-07-09 22:22:35

+0

我明白你的意思 - 我誤讀了「線程正在進行」並理解「線程活着」。我同意你的回答。 – assylias 2012-07-09 22:24:27

0

正如達斯·維達說,你可以使用一個線程池(CachedThreadPool)。使用這個構造,你不必指定具體的線程數量。

從​​網站:

  • 的newCachedThreadPool方法創建一個可擴展的線程池的執行者。該執行程序適用於啓動許多短期任務的應用程序。

也許這是你在找什麼。 關於內核的數量很難說。你有4個超線程核心,至少有一個核心,你應該離開你的操作系統。我會說4-6線程。