簡體   English   中英

在java中創建線程池的最佳方法是什么

[英]What is the best way to create thread pool in java

我試圖在我的一個應用程序中使用執行程序服務,因為我的機器有4個核心,因此我創建了一個8的池,根據我最近的搜索,我發現只有2個活動線程可以在核心上運行。 當我通過java檢查核心數時也發現值為4

int cores = Runtime.getRuntime().availableProcessors();
ExecutorService executor = Executors.newFixedThreadPool(cores*2);

請建議我做得正確,因為當我的cpu只能處理8個線程時,我沒有看到任何值得創建500的池。

超線程

您應該閱讀超線程技術。 該術語特別是英特爾用於其專有的同步多線程(SMT)實現的品牌名稱,但也更普遍地用於SMT。

一個過於簡化的解釋:

在傳統的CPU中,線程之間的切換非常昂貴。 寄存器是CPU核心實際處理的幾個數據的保留位置。 切換線程時,必須換掉這些寄存器中的值。 同樣地,高速緩存(保持數據位置,比寄存器慢但比RAM快)也可以被清除。 這一切都需要時間。

CPU中的超線程設計添加了一組重復的寄存器。 每個具有雙組寄存器的內核意味着它可以在線程之間切換而無需交換寄存器中的值。 線程之間的切換要快得多,以至於CPU位於操作系統中,將每個核心報告為一對(虛擬)核心。 因此,例如,4核芯片將顯示為8個核心。

我發現只有2個活動線程可以在核心上運行

請注意,切換線程仍然需要一些費用,而且費用要低得多。 超線程CPU核心仍然一次只執行一個線程。 超線程意味着線程之間的切換更容易,更快捷。

對於使用線程通常處於保持模式的機器,等待一些外部功能完成,例如通過網絡呼叫,超線程非常有意義。 對於內核可能正在進行CPU限制的工作(如數字運算,模擬,科學數據分析)的應用程序,超線程可能沒那么有用。 因此,在進行此類工作的機器上,系統管理員可能決定禁用超線程,因此4個內核實際上只是4個內核。 此外,由於最近與超線程技術相關的安全漏洞 ,一些系統管理員可能決定禁用超線程。

線程池

當我的cpu只能處理8個線程時,創建一個500的池。

線程池的大小取決於應用程序的行為。 如果有受CPU限制的應用程序,那么您當然希望將此類CPU密集型線程的數量限制為小於實際或虛擬內核的數量。 如果您的應用程序不受CPU限制,如果它們經常執行文件I / O ,網絡I / O或其他在等待其他資源時通常無效的活動,那么您可以擁有比核心更多的線程。 如果你的線程經常閑置無所事事,那么你可以擁有更多的線程。

在java中創建線程池的最佳方法是什么

沒有具體規則可以幫助您 您最初必須做出有根據的猜測,然后在生產中監控您的應用和主機 因此,您可能希望有一種方法可以在運行時設置應用程序中使用的線程數,而不是對數字進行硬編碼。 例如,使用首選項設置或使用JMX 學習使用Java Flight RecorderMission Control等分析工具; 兩者現在都與基於OpenJDK的Java發行版捆綁在一起。 如果要部署到支持DTrace的系統(macOS,BSD等),這也可能有所幫助。

在具有不同功能部分的不同工作負載的應用程序中,維護多個線程池可能是有意義的。 使用具有極少數線程的池用於CPU密集型工作,使用具有大量線程的池用於CPU非密集型工作。 現代Java中的Executors框架有助於簡化這一過程。

考慮您可能部署到計算機的所有應用程序。 並考慮該計算機上運行的所有其他應用程序。 並考慮到操作系統的CPU需求。 畢竟,您可能會發現某些線程池最多只能設置為一個或兩個線程。

棘手的東西

線程安全是非常棘手的復雜工作。 在線程(變量,文件等)之間共享資源時,您必須自己教育保護這些資源免受濫用的問題。

必讀: Brian Goetz等人的Java Concurrency in Practice

轉到System properties並檢查有多少cores (physical cores)logical processors (virtual cores)

例如 :

如果您的系統有n個核心n個邏輯處理器 這意味着您的處理器不支持hyperthreading

如果您的系統有n個內核nx 2個邏輯處理器 這意味着您的處理器支持hyperthreading 您可以並行執行n * 2個線程。

注意:假設您有超線程支持。 現在,您有8個內核和16個虛擬內核。

然后,處理器將提供最多16個線程的良好吞吐量。 如果增加線程池超過16個線程,吞吐量將變得均勻並且不會改變太多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM