需求:
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;
}
}
分享到:
相关推荐
在多线程环境中,确保这些计算方法是线程安全的,可以考虑使用`synchronized`关键字或者线程局部变量。另外,对于性能敏感的应用,可能需要考虑缓存常见的计算结果,以减少重复计算。 6. **异常处理**: 需要对...
- **示例1**:题目要求创建2个进程,分别对数组进行排序和求和操作。 - **进程1**:定义一个10元素的数组,调用`f1`文件中的函数进行排序,并输出结果及进程ID。 - **进程2**:定义一个10元素的数组,调用`f2`文件...
1. **统计计算**:这些库通常包含对数组元素进行统计计算的方法,如求和、平均值、中位数、标准差等。 2. **排序与筛选**:快速地对数据进行排序或根据条件筛选,对于数据探索和分析非常重要。 3. **聚合操作**:...
24. **多线程求和**:简单地将循环范围拆分给每个线程可能导致负载不均,因为不同部分的计算量可能不同,而且如果没有同步,可能会引发数据竞争。 这些知识点涵盖了并行计算的多个方面,包括并行架构、并行优化技术...
应用梅尔频率滤波器组进行信号 对每个滤波器内的能量求和,并以10为底的对数 取每个滤波器的DCT 保持系数[1:13] 计算参考向量和输入向量的DTW最佳路径和欧式距离 去做 噪音门 预加重/提升 特征向量数据库 音频记录/...
例如,在并行循环中,对数组元素求和就是一个典型的减少操作场景。 ### 共享与私有变量 在并行环境中,区分共享变量和私有变量非常重要。共享变量在所有线程之间共享,而私有变量则只在各自的线程中存在。正确的...
归约操作允许程序员并行地对数组中的所有元素进行运算(如求和),然后合并结果。 2. 共享存储模型: 共享存储模型适用于共享存储多处理器系统,其中所有处理器可以直接访问相同的内存空间,无需通过消息传递来交换...
"parallel_array_sum" 是一个可能涉及并行计算的C++程序,用于对数组进行求和操作。在现代计算机科学中,利用多核处理器的并行处理能力可以显著提高计算效率,尤其是在处理大量数据时。接下来,我们将深入探讨与这个...
8. 队列和同步操作:这些操作允许构建多线程环境下的输入管道。例如,tf.train.shuffle_batch用于将输入数据打包并随机乱序。 9. 数据类型转换:数据类型转换在机器学习中也很常见,tf.to_double、tf.to_float、tf....
- **知识点概述**:题目中给出了一个使用冒泡排序算法对数组进行降序排序的例子。该算法通过比较相邻元素并交换它们的位置来实现排序。 - **例题解析**:题目中的程序首先定义了一个数组 `a[10]` 并初始化为 `{1, 2...
例如,以下是一个简单的 lambda 表达式,用于对数组中的元素进行求和: ```java int[] numbers = {1, 2, 3, 4, 5}; Arrays.stream(numbers).reduce((a, b) -> a + b).orElse(0); ``` 这里的 `(a, b) -> a + b` ...
- GIL的目的是为了简化Python的内存管理,但同时也成为了多线程处理中的一个瓶颈。 5. Python数据类型 - Python有内置的基本数据类型,包括整型(int)、布尔型(bool)、字符串(str)、列表(list)、元组(tuple)、字典...
- **数组排序**:示例代码实现了对数组中的数据按降序排列的功能。注意该代码通过传递数组的一部分起始地址来实现局部排序。 ### JavaScript 输出 - **JavaScript随机数生成**:可以使用JavaScript的`Math.random...
6. **并发编程**:`java.util.concurrent`包提供了线程池、并发容器(如`ConcurrentHashMap`)以及同步工具类(如`Semaphore`、`CyclicBarrier`),简化了多线程编程。 7. **泛型**:Java的泛型允许在类型级别进行...
5. **GIL(全局解释器锁)**:GIL是Python解释器的一个特性,它使得在同一进程中的多线程环境下,任何时刻只有一个线程在执行Python字节码。因此,Python的多线程在CPU密集型任务中并不适合,但可以用于IO密集型任务...
- **Critical Section**:临界区是指多线程环境下,同一时刻只允许一个线程访问的代码段,用于保护共享资源。 - **Mutex**:互斥量是一种同步机制,用于保护临界区,确保任何时候只有一个线程持有互斥量,从而访问...
这种机制在多任务或多线程环境下非常有用。 ##### 串行内存搜索(Serial Memory Search) 串行内存搜索工具用于在串行内存中查找特定的数据或模式。这种工具对于数据分析或故障排查非常有用。 ##### 串行队列...
- `tf.train.Coordinator`: 控制多个线程的运行。 **6. Flow control** - `tf.control_flow_ops.merge`: 合并控制流。 - `tf.control_flow_ops.switch`: 控制流开关。 - `tf.while_loop`: while循环。 #### 结论 ...
`,使用循环对数组元素进行遍历并累加求和。遍历结束后,变量`s`的值为280。 ### 21. 列表框与组合框的功能差异 - **知识点**: 列表框与组合框的功能差异。 - **解释**: 列表框只提供从已有的选项中选择,而不能...