问题:利用多线程的知识输出打印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实例:核心方法

求和来验证每个值是否取得,如下:

核心输出方法如下:

image.png



计算求和方法,用于验证校验数据是否遗落,保证输出结果的正确性;使用method替代中间变量

image.png


利用jdk的动态代理,打印时间差

image.png对forkjoin的调用,设置起始值,结束值和阀值,叫生成的队列交给线程池消化,最后关闭线程池

image.png

最后的main方法:

image.png最终运行的结果:

使用StringBuilder后:

以0~1000万,阀值1000为例

并行数    时间(ms)

16       4268

时间差了10倍,哈哈


最终结果:1-1亿输出结果为:39575ms ,即40秒


问题思考:多线程一定比单线程快吗?在什么业务场景下考虑多线程?