该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-13
sunwenran 写道 赞一个。
问题是我用你的例子比较直接加 long noCurrentSum=0L; for(Integer i:list){ noCurrentSum+=i; } 发现时间差不多。而且有时候直接加更快。纠结了。。我的是双核。 可能是你给的数据量还不够大 |
|
返回顶楼 | |
发表时间:2010-07-13
Hypnusds 写道 以前写过类似这样的东西 但是没有CyclicBarrier类
ExecutorService 的 shutdown 方法应该在 barrier.await(); 前面 你的内部类实现 callable 接口 然后Call 会返回值 ExecutorService 的submit方法可以返回一个 Future 对象 Future 对象来实现同步很好用的 可以尝试下 用 Futrue 的 isDone 来判断线程是否工作结束 嗯。这也是一个思路,我前面的回帖中有个用Callable和Future写的,不过采用的是ExecutorService的invokeAll方法,不用受到控制等待了,返回的所有的Future的isDone都是ture。 |
|
返回顶楼 | |
发表时间:2010-07-13
sdh5724 写道 性能不好, 用了同步。 可以分割同步。
sdh5724,能具体说一下吗?多谢了。 |
|
返回顶楼 | |
发表时间:2010-07-13
dilantaya 写道 云中苍月 写道 lubber 写道 个人也觉得使用CountDownLatch就可以了. 还有, 包含所有整数的List没必要拆分为一个个小的List, 只要算出各自计算的index范围, 第一计算1-100个, 第二个计算101-200个, 从同一个List中取值.
和我的想法一样,sublist本身的消耗是非常大的,在这个场景中完全没有必要,可以将index范围和大List作为Runnable的属性注入,计算时直接调用get(index)方法即可。 wow 这个更妙 我感觉使用一个index范围和使用一个subList差不多,都是拆分成了小块,只不过一个用范围标记的,一个直接是一个List小块。。List的subList函数消耗也不大。下面是生成SubList的源代码,只是进行了一下索引以为,比for循环get(i)取值要好得多。 SubList(AbstractList<E> list, int fromIndex, int toIndex) { if (fromIndex < 0) throw new IndexOutOfBoundsException("fromIndex = " + fromIndex); if (toIndex > list.size()) throw new IndexOutOfBoundsException("toIndex = " + toIndex); if (fromIndex > toIndex) throw new IllegalArgumentException("fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")"); l = list; offset = fromIndex; size = toIndex - fromIndex; expectedModCount = l.modCount; } |
|
返回顶楼 | |
发表时间:2010-07-13
xifo 写道 另外,个人感觉这里用CountDownLatch比用CyclicBarrier更合适点,这个案例只需要主线程等待子线程,各子线程间不需要相互等待,子线程求和完成后可以立即输出并结束。
嗯。说的不错,CountDownLatch这个更适合这个场景,只需要new CountDownLatch(threadCounts);然后在每个线程工作完成后调用countDown(),在main主线程上使用await()等待即可。这适用于子线程完成工作后就想马上看到该线程的成果的场景中。不过这里采用CyclicBarrier也不错。 |
|
返回顶楼 | |
发表时间:2010-07-13
dilantaya 写道 很好的列子,后面大家补充的算法漏洞也很精彩
是啊。一个人写的时候难免有漏过的地方,测试数据也不一定周全。这里谢谢大家了,我都已经改正了。呵呵。 |
|
返回顶楼 | |
发表时间:2010-07-13
有这么麻烦不?每一段的和加到一全局的变量上不就可以了?
|
|
返回顶楼 | |
发表时间:2010-07-13
最后修改:2010-07-13
可以用atomic来替代count的synchronized
|
|
返回顶楼 | |
发表时间:2010-07-13
yuchujin 写道 有这么麻烦不?每一段的和加到一全局的变量上不就可以了?
目前就是把子线程的和添加到全局变量上的。 |
|
返回顶楼 | |
发表时间:2010-07-13
夜枫舞影 写道 可以用atomic来替代count的synchronized
是的。可以使用原子类代替。 |
|
返回顶楼 | |