最近的工作需要統計一些復雜的報表,為了提高效率,想用多線程去實現,但要在所有線程完成統計任務后,將結果匯總。所以在思考有沒有什么辦法解決,之所以是“系列一”是因為我想記錄下我的思考過程。
1、首先設計一個Executer,負責任務的執行和匯總:
2、寫一個抽象的Job類,負責執行具體的任務
3、測試,先來一個具體的任務實現。
4、測試。
5、好吧,看一下結果
哈哈,看來是可以了,最后匯總任務的處理時間是2032毫秒,看來是比單個任務順序執行來的快。但是有幾個問題:
1)如果沒有catch那個超級Exception的話,就會拋下面的異常:
2)為啥會打印N多個同樣值threadCount呢?
于是和同事(河東)溝通,他說wait要放在synchronized里面才行,好吧,試一下,改進一下Executer和Job
6、測試一下:
還真的行,謝謝河東哈!
但是原因是什么呢?回去查了查書《Java并發編程實踐》,見附件!
看來之前是不會用wait和notify,哈哈~!
感謝河東,和你交流收獲很大!
順便測試一下java多線程情況下,多核CPU的利用率,修改上面的線程池大小和任務數(2個線程處理1000000個任務,去掉MyJob的sleep(這樣可以多搶些CPU時間),結果如下:
看來window下是可以利用多核的,雖然是一個JVM進程。之前和斯亮討論的結論是錯誤的。