`
lotusyu
  • 浏览: 34264 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

多线程对数组进行求和

阅读更多
需求:
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;
	}

}
分享到:
评论

相关推荐

    java 公式计算汇总,直接调用其方法即可进行运算

    在多线程环境中,确保这些计算方法是线程安全的,可以考虑使用`synchronized`关键字或者线程局部变量。另外,对于性能敏感的应用,可能需要考虑缓存常见的计算结果,以减少重复计算。 6. **异常处理**: 需要对...

    北华大学嵌入式考试题

    - **示例1**:题目要求创建2个进程,分别对数组进行排序和求和操作。 - **进程1**:定义一个10元素的数组,调用`f1`文件中的函数进行排序,并输出结果及进程ID。 - **进程2**:定义一个10元素的数组,调用`f2`文件...

    使用类型化数组有效地处理柱状数据

    1. **统计计算**:这些库通常包含对数组元素进行统计计算的方法,如求和、平均值、中位数、标准差等。 2. **排序与筛选**:快速地对数据进行排序或根据条件筛选,对于数据探索和分析非常重要。 3. **聚合操作**:...

    南开21秋-并行程序设计答案.pdf

    24. **多线程求和**:简单地将循环范围拆分给每个线程可能导致负载不均,因为不同部分的计算量可能不同,而且如果没有同步,可能会引发数据竞争。 这些知识点涵盖了并行计算的多个方面,包括并行架构、并行优化技术...

    DFT的matlab源代码-ASR:用于自动语音识别(ASR)的梅尔频率倒谱系数(MFCC)和动态时间规整(DTW)算法的Python2.7实

    应用梅尔频率滤波器组进行信号 对每个滤波器内的能量求和,并以10为底的对数 取每个滤波器的DCT 保持系数[1:13] 计算参考向量和输入向量的DTW最佳路径和欧式距离 去做 噪音门 预加重/提升 特征向量数据库 音频记录/...

    VisualAge C++ for AIX Compiler Reference 编译器 参考

    例如,在并行循环中,对数组元素求和就是一个典型的减少操作场景。 ### 共享与私有变量 在并行环境中,区分共享变量和私有变量非常重要。共享变量在所有线程之间共享,而私有变量则只在各自的线程中存在。正确的...

    [详细完整版]并行程序设计.ppt

    归约操作允许程序员并行地对数组中的所有元素进行运算(如求和),然后合并结果。 2. 共享存储模型: 共享存储模型适用于共享存储多处理器系统,其中所有处理器可以直接访问相同的内存空间,无需通过消息传递来交换...

    parallel_array_sum

    "parallel_array_sum" 是一个可能涉及并行计算的C++程序,用于对数组进行求和操作。在现代计算机科学中,利用多核处理器的并行处理能力可以显著提高计算效率,尤其是在处理大量数据时。接下来,我们将深入探讨与这个...

    tensorflow常用函数介绍

    8. 队列和同步操作:这些操作允许构建多线程环境下的输入管道。例如,tf.train.shuffle_batch用于将输入数据打包并随机乱序。 9. 数据类型转换:数据类型转换在机器学习中也很常见,tf.to_double、tf.to_float、tf....

    2021-2022计算机二级等级考试试题及答案No.17864.docx

    - **知识点概述**:题目中给出了一个使用冒泡排序算法对数组进行降序排序的例子。该算法通过比较相邻元素并交换它们的位置来实现排序。 - **例题解析**:题目中的程序首先定义了一个数组 `a[10]` 并初始化为 `{1, 2...

    JDK8_API_Chinese.rar

    例如,以下是一个简单的 lambda 表达式,用于对数组中的元素进行求和: ```java int[] numbers = {1, 2, 3, 4, 5}; Arrays.stream(numbers).reduce((a, b) -&gt; a + b).orElse(0); ``` 这里的 `(a, b) -&gt; a + b` ...

    110道Python面试题

    - GIL的目的是为了简化Python的内存管理,但同时也成为了多线程处理中的一个瓶颈。 5. Python数据类型 - Python有内置的基本数据类型,包括整型(int)、布尔型(bool)、字符串(str)、列表(list)、元组(tuple)、字典...

    2021-2022计算机二级等级考试试题及答案No.13790.docx

    - **数组排序**:示例代码实现了对数组中的数据按降序排列的功能。注意该代码通过传递数组的一部分起始地址来实现局部排序。 ### JavaScript 输出 - **JavaScript随机数生成**:可以使用JavaScript的`Math.random...

    30个java工具类

    6. **并发编程**:`java.util.concurrent`包提供了线程池、并发容器(如`ConcurrentHashMap`)以及同步工具类(如`Semaphore`、`CyclicBarrier`),简化了多线程编程。 7. **泛型**:Java的泛型允许在类型级别进行...

    数据分析面试题-python笔面试题汇总2.docx

    5. **GIL(全局解释器锁)**:GIL是Python解释器的一个特性,它使得在同一进程中的多线程环境下,任何时刻只有一个线程在执行Python字节码。因此,Python的多线程在CPU密集型任务中并不适合,但可以用于IO密集型任务...

    c++笔试题大全

    - **Critical Section**:临界区是指多线程环境下,同一时刻只允许一个线程访问的代码段,用于保护共享资源。 - **Mutex**:互斥量是一种同步机制,用于保护临界区,确保任何时候只有一个线程持有互斥量,从而访问...

    快思聪函数中文说明

    这种机制在多任务或多线程环境下非常有用。 ##### 串行内存搜索(Serial Memory Search) 串行内存搜索工具用于在串行内存中查找特定的数据或模式。这种工具对于数据分析或故障排查非常有用。 ##### 串行队列...

    Tensor-flow常用函数

    - `tf.train.Coordinator`: 控制多个线程的运行。 **6. Flow control** - `tf.control_flow_ops.merge`: 合并控制流。 - `tf.control_flow_ops.switch`: 控制流开关。 - `tf.while_loop`: while循环。 #### 结论 ...

    2021-2022计算机二级等级考试试题及答案No.12318.docx

    `,使用循环对数组元素进行遍历并累加求和。遍历结束后,变量`s`的值为280。 ### 21. 列表框与组合框的功能差异 - **知识点**: 列表框与组合框的功能差异。 - **解释**: 列表框只提供从已有的选项中选择,而不能...

Global site tag (gtag.js) - Google Analytics