關於多線程輸出1到一億平方的探討
問題拆解:1.線程數量較多,考慮線程池來管理
2.主線程監控其他線程,如何實現?(所有線程結束後打印結束時間啊)
3.線程的最佳數量
4. 1到一億如何劃分範圍
5.如何將效率提到最高,花費時間減小到最低
知識儲備:知道jdk7增加fork(大問題切割成足夠小的問題)join(小問題的結果匯總)框架,詳細學習forkjoin,發現完美解決1-4的問題?
關於forkjoin的支持請自行百度,在此不再累述。
嘗試:
以0~1000萬,閥值1000為例
並行數 時間(ms)
主線程only 41104
1 39710
2 40299
3 40771
4 40499
5 41380
6 40089
7 40080
8 41940
9 43411
10 42245
11 40670
12 41621
13 41075
16 40063
100 42164
問題:有必要計算最佳進程數嗎?如何計算?感覺差別不是很明顯啊?迷茫
以0~1000萬,並行數16為例
閥值 時間(ms)
100 43371
1000 42639
10000 42750
100000 42535
搞了半天,感覺差別不大,總結耗時也得6、7分鐘
最終發現問題的源頭:System.out.prinln()太耗時間了,使用StringBuilder替換,40s完美輸出
最終代碼賦上:
forkjoin實例:核心方法
求和來驗證每個值是否取得,如下:
核心輸出方法如下:
計算求和方法,用於驗證校驗數據是否遺落,保證輸出結果的正確性;使用method替代中間變量
利用jdk的動態代理,打印時間差
對forkjoin的調用,設置起始值,結束值和閥值,叫生成的隊列交給線程池消化,最後關閉線程池
最後的main方法:
最終運行的結果:
使用StringBuilder後:
以0~1000萬,閥值1000為例
並行數 時間(ms)
16 4268
時間差了10倍,哈哈
最終結果:1-1億輸出結果為:39575ms ,即40秒
問題思考:多線程一定比單線程快嗎?在什麽業務場景下考慮多線程?
關於多線程輸出1到一億平方的探討