`
landyer
  • 浏览: 138899 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多线程对数组进行求和

    博客分类:
  • java
 
阅读更多

需求: 
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;
	}

}

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics