浏览 4663 次
锁定老帖子 主题:多线程对数组进行求和
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-09-29
最后修改:2011-09-29
1:对一个大数组进行求和。 2:需要使用多线程实现。 思路: 1:将大数组根据线程的数量进行拆分。 2:每个线程对数组的部分元素进行求和。 3:等待所有线程执行完毕,返回结果。 说明: 在论坛中看到有一个帖子是使用concurrent包实现的,我这个例子没有使用concurrent包。发现也挺简单。 代码如下所示: /** * 多线程求和 * @author Administrator * */ public class ThreadsSum { static public long sum(final int[] array) { if (array == null || array.length == 0) { throw new IllegalArgumentException("array length must greater than 0"); } final RuntimeData rd = new RuntimeData(); int threadCount = rd.getThreadCount(array); System.out.println("thread count:" + threadCount); //每线程计算的数组元素个数 final int lenPerThread = array.length / threadCount; // System.out.println(lenPerThread); for (int i = 0; i < threadCount; i++) { final int index = i; new Thread() { @Override public void run() { long s = 0; int start = index * lenPerThread; int end = start + lenPerThread; for (int j = start; j < end; j++) { s += array[j]; } synchronized (rd) { rd.sum += s; rd.finishThreadCount++; // System.out.println("thread[" + getName() + "] finished,sum:" + d.sum); } }; }.start(); } //余下的array元素 int remain = array.length % threadCount; System.out.println("remain element count:" + remain); long s = 0; for (int i = array.length - remain; i < array.length; i++) { s += array[i]; } synchronized (rd) { rd.sum += s; } while (rd.finishThreadCount != threadCount) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); break; } } return rd.sum; } public static void main(String[] args) { int[] array = new int[15]; long s = System.currentTimeMillis(); long sum = 0; for (int i = 0; i < array.length; i++) { array[i] = i; sum += array[i]; } long start = System.currentTimeMillis(); System.out.println(start - s); long sum2 = sum(array); long end = System.currentTimeMillis(); long cost = end - start; // System.out.println(sum); // System.out.println(sum2 == sum); System.out.println("sum:" + sum + ";equals:" + (sum2 == sum) + ";cost:" + cost); } } /** * 保存运行时的相关数据 * */ class RuntimeData { //保存和 long sum; //默认线程数 int defThreadCount = 17; //已经执行完成的线程数 int finishThreadCount; /** * 根据数据长度获取线程数,线程数不会大于数组的长度。 * @param array * @return */ public int getThreadCount(int[] array) { if (array.length < defThreadCount) { return array.length; } return defThreadCount; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |