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