读书人

多线程对数组开展求和

发布时间: 2012-11-09 10:18:48 作者: rapoo

多线程对数组进行求和

需求:?
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() {@Overridepublic 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;}}

?

?

?

读书人网 >编程

热点推荐