我有一個Java應用程序與遠程主機創建SSL套接字。我想用線程來加速這個過程。如何決定在java中創建合適的線程數量?
我希望不影響程序性能的最大可能利用率。我怎樣才能決定合適的線程數量?運行以下行後:Runtime.getRuntime().availableProcessors();
我得到了4.我的處理器是英特爾核心i7,具有8 GB RAM。
我有一個Java應用程序與遠程主機創建SSL套接字。我想用線程來加速這個過程。如何決定在java中創建合適的線程數量?
我希望不影響程序性能的最大可能利用率。我怎樣才能決定合適的線程數量?運行以下行後:Runtime.getRuntime().availableProcessors();
我得到了4.我的處理器是英特爾核心i7,具有8 GB RAM。
如果您有4個內核,那麼從理論上講,您應該在任何給定時間都有四個工作線程進行最大限度的優化。不幸的是理論上發生的事情在實踐中從未發生您可能有工人線程,無論出於何種原因,他們都有大量的停機時間。也許他們正在網上尋找更多的數據,或者從磁盤讀取數據,其中很多數據只是在等待而不使用cpu。
根據你在做多少等待,你會想要提高數字。增加線程數量的成本是您將有更多的上下文切換和資源競爭。好處是你將有另一個線程準備好工作,以防其他線程決定必須爲某些事情做出決定。
最好的辦法是把它設置成某種東西(讓我們從4開始),然後繼續前進。使用各種設置對您的代碼進行分析,然後查看您的基準測試結果是否升高或降低。你應該很快看到一個模式和盈虧平衡點。
當談到優化,可以推論所有你想了解應該是最快的,但你不會打實際運行和定時代碼,以真正回答這個問題。
正如達斯·維達說,你可以使用一個線程池(CachedThreadPool
)。使用這個構造,你不必指定具體的線程數量。
從網站:
也許這是你在找什麼。 關於內核的數量很難說。你有4個超線程核心,至少有一個核心,你應該離開你的操作系統。我會說4-6線程。
使用線程池。 – DarthVader 2012-07-09 22:09:16
@DarthVader我認爲問題是:什麼大小? – assylias 2012-07-09 22:10:50
@DarthVader:我已經在使用池。但是我應該在池中定義多少個線程?我怎麼知道哪個號碼適合我的電腦? – 2012-07-09 22:12:29