您的位置:首页 > 其它

关于多线程输出1到一亿平方的探讨

2018-02-13 04:07 281 查看
问题:利用多线程的知识输出打印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秒

问题思考:多线程一定比单线程快吗?在什么业务场景下考虑多线程?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 探讨 forkjoin