[英]What is the best way to control thread creation in Java on a given machine?
在我的應用程序中,我想根據用戶的輸入創建線程。 例如,如果用戶提供 10 個,我只需創建一個包含 10 個線程的池來執行某些操作。 沒有對用戶輸入的控制。 如果用戶提供 10k 作為輸入,我不想創建 10k 線程。 這對機器來說太過分了。 有什么建議嗎?
如何控制線程池計數?
如何計算可以在給定機器上創建的最大線程數?
有什么建議嗎?
如果不對生產環境中的應用程序進行一些分析並獲得一些真實的統計信息,幫助您確定實現 CPU 最大使用率的最佳條件,則無法輕松實現這一點(請參閱阿姆達爾定律)。
也就是說,有一件事是肯定的,而且您已經知道了:您創建的線程數不應超過最適合您的運行環境的數量。
從Java Concurrency in Practice做一個總結:
條款 8.2 調整線程池的大小
線程池的理想大小取決於將提交的任務類型和部署系統的特性。 線程池大小應該很少被硬編碼; 相反,池大小應由配置機制提供或通過咨詢
Runtime.availableProcessors
動態計算。
例如,
對於計算密集型任務,N cpu處理器系統通常通過 N cpu + 1 個線程的線程池實現最佳利用率。
並給予
N cpu = CPU 數量
U cpu = 目標 CPU 利用率,0 ≤ U cpu ≤ 1
W/C = 等待時間與計算時間的比率
將處理器保持在所需利用率的最佳池大小是:
(這應該回答如何計算我可以在給定機器上創建的最大線程數? )
N 個線程= N cpu ∗ U cpu ∗ (1 + W/C)
您可以使用以下命令確定可用 CPU 的數量
int numberOfCPU = Runtime.getRuntime().availableProcessors();
如何控制線程池計數?
您可以(並且應該)使用添加到 Java 中的任何並發類,而不是自己創建和管理Thread
。 例如ThreadPoolExecutor
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.