1. 程式人生 > >關於多線程輸出1到一億平方的探討

關於多線程輸出1到一億平方的探討

總結 技術 如何實現 線程池 join 代碼 ima 學習 size

問題:利用多線程的知識輸出打印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到一億平方的探討