该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-13
性能不好, 用了同步。 可以分割同步。
|
|
返回顶楼 | |
发表时间:2010-07-13
lubber 写道 个人也觉得使用CountDownLatch就可以了. 还有, 包含所有整数的List没必要拆分为一个个小的List, 只要算出各自计算的index范围, 第一计算1-100个, 第二个计算101-200个, 从同一个List中取值.
和我的想法一样,sublist本身的消耗是非常大的,在这个场景中完全没有必要,可以将index范围和大List作为Runnable的属性注入,计算时直接调用get(index)方法即可。 |
|
返回顶楼 | |
发表时间:2010-07-13
高手啊!没看懂
|
|
返回顶楼 | |
发表时间:2010-07-13
云中苍月 写道 lubber 写道 个人也觉得使用CountDownLatch就可以了. 还有, 包含所有整数的List没必要拆分为一个个小的List, 只要算出各自计算的index范围, 第一计算1-100个, 第二个计算101-200个, 从同一个List中取值.
和我的想法一样,sublist本身的消耗是非常大的,在这个场景中完全没有必要,可以将index范围和大List作为Runnable的属性注入,计算时直接调用get(index)方法即可。 wow 这个更妙 |
|
返回顶楼 | |
发表时间:2010-07-13
最后修改:2010-07-13
将大的list分块1-n,n-2n,......,取决于线程数,都是计算型任务,线程数最好使用cpu 核心数。
主线程用CountDownLatch等待结果,结果放在CopyOnWrite list 里面。 |
|
返回顶楼 | |
发表时间:2010-07-13
云中苍月 写道 lubber 写道 个人也觉得使用CountDownLatch就可以了. 还有, 包含所有整数的List没必要拆分为一个个小的List, 只要算出各自计算的index范围, 第一计算1-100个, 第二个计算101-200个, 从同一个List中取值.
和我的想法一样,sublist本身的消耗是非常大的,在这个场景中完全没有必要,可以将index范围和大List作为Runnable的属性注入,计算时直接调用get(index)方法即可。 能写出来让在家学习学习吗? |
|
返回顶楼 | |
发表时间:2010-07-13
wgy_superpower 写道 xifo 写道 思路是对的,可惜算法有问题,大多数情况下计算结果不正确。
不信的话,试试把这一行 for (int i = 1; i <= 1000000; i++) 换成 for (int i = 0; i <= 1000000; i++) 如果计算正确,两个计算结果应该一样,实际上计算结果会少一百万,原因是分割那里没有考虑尾数。 ![]() 多谢以上各位,现在已经修正,加了一句 if(list.size()%threadCounts!=0){//不整除,增加一个线程 threadCounts=threadCounts+1; } 谢谢以上各位的指正,这里就不一一贴名字了。。 |
|
返回顶楼 | |
发表时间:2010-07-13
赞一个。
问题是我用你的例子比较直接加 long noCurrentSum=0L; for(Integer i:list){ noCurrentSum+=i; } 发现时间差不多。而且有时候直接加更快。纠结了。。我的是双核。 |
|
返回顶楼 | |
发表时间:2010-07-13
最后修改:2010-07-13
ExecutorService + FutureTask
不需要countdownlatch |
|
返回顶楼 | |
发表时间:2010-07-13
呵呵,该贴很有意义,赞。
|
|
返回顶楼 | |