任務定義:我需要映射一個非常大的陣列。例如,讓我們來看一個findMax()
函數。所以任務是儘可能快地完成這個任務(這意味着並行)。叉/加入:最佳的線程數
HW:我有8個內核他們每個人都有2個超級線程
public static void main(String... args) {
int maxThreadAmount = Runtime.getRuntime().availableProcessors(); // GET 8
}
解決方案#1:只需運行任務分成N個線程。其中N應該是一些最佳數字。
Question#1: Next right:int optimalThreadAmount = maxThreadAmount - 1
?
解決方案#2:我想通過Fork/Join框架解決這個問題。如果輸入過大,每個任務都會分成兩個並行子任務。所以,我會得到這樣的
Find Max
[array] <---- +1 pending thread
/ \
/ \
Find Max Find Max
[1/2 array] [1/2 array] <-------- +2 pending threads
/ \ / \
/ \ .. ..
Find Max Find Max
[1/4 array] [1/4 array] <-------- +4 four pending threads
/ \ /\
/ \ .. ..
Find Max Find Max
[1/8 array] [1/8 array] <----------- +8 active threads
問題2:考慮到與叉/加入算法,我們會得到一堆待處理的線程這將是最佳線程數?
'availableProcessors'調用可能已經考慮到HyperThreading。 – chrylis
@chrylis是的,無論如何谷歌說。但由於某種原因,我得到了'8'數字而不是16個。但不管是否需要,問題仍然相關 –
映射數組實際涉及多少工作?如果你是緩存或內存訪問受限,多線程在這裏沒有幫助。另外,如果您的意思是使用Map,請確保Map實現安全有效地處理併發插入。這可能會導致任何多線程獲益。 –