最近的工作需要统计一些复杂的报表,为了提高效率,想用多线程去实现,但要在所有线程完成统计任务后,将结果汇总。所以在思考有没有什么办法解决,之所以是“系列一”是因为我想记录下我的思考过程。
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进程。之前和斯亮讨论的结论是错误的。