`

多线程数组求和测试

阅读更多
package cn.wistone.game;

import java.util.concurrent.Callable;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* 多线程数组求和 与单循环对比
*
* @author dyx
*
*/
public class SumArrayTest {
private static int innerLength = 10;
private static int outterlength = 10000000;
private static int[][] A = new int[innerLength][outterlength];
public CyclicBarrier cb;
public Long thread_total=new Long(0);
ExecutorService executorService = Executors.newCachedThreadPool();
private static long normal_total;
/**
* 初始化数据
*/
static {
for (int i = 0; i < innerLength; i++) {
for (int j = 0; j < outterlength; j++) {
A[i][j]=i+1;
}
}
}

public SumArrayTest() {
final long start_time = System.currentTimeMillis();
cb = new CyclicBarrier(innerLength, new Runnable() {
public void run() {
long end_time = System.currentTimeMillis();
System.out.println("多线程计算时间:" + (end_time - start_time));
System.out.println("多线程计算结果:" + thread_total);
executorService.shutdown();
}
});

for (int i = 0; i < innerLength; i++) {
executorService.submit(new CalculateArray2(A[i]));
}

}

class CalculateArray2 implements Runnable{
int[] data;

public CalculateArray2(int[] dataTemp) {
data = dataTemp;
}

@Override
public void run(){
long totalNum = 0;
for (int i = 0; i < data.length; i++) {
totalNum += data[i];
}
try {
synchronized (thread_total) {
thread_total += totalNum;
// System.out.println(total);
}
cb.await
} catch (Exception e) {
e.printStackTrace();
}
}
}


class CalculateArray implements Callable<Long> {
int[] data;

public CalculateArray(int[] dataTemp) {
data = dataTemp;
}

public Long call() throws Exception {
long totalNum = 0;
for (int i = 0; i < data.length; i++) {
totalNum += data[i];
}
try {
synchronized (thread_total) {
thread_total += totalNum;
// System.out.println(total);
}
} catch (Exception e) {
e.printStackTrace();
}
cb.await();
return totalNum;
}
}

/**
* 普通方式
*/
public static void count() {
long start_time = System.currentTimeMillis();
for (int i = 0; i < innerLength; i++) {
for (int j = 0; j < outterlength; j++) {
normal_total += A[i][j];
}
}
long end_time = System.currentTimeMillis();
System.out.println("普通计算时间:" + (end_time - start_time));
System.out.println("普通计算结果:" + normal_total);
}


public static void main(String[] args) {
new SumArrayTest();// 多线程方式
SumArrayTest.count(); // 普通循环方式
}

}


结果就不贴了,总体还是多线程并行计算会快10-20 ms
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    高性能计算导论实验4-基于Pthreads并行实现通用矩阵乘法、数组求和及二次方程组求解

    在多线程环境中,可以将大型矩阵的行或列分配给不同线程,同时进行计算,从而加快求解速度。equation_pthread.c文件可能实现了这样的并行算法。需要注意的是,解决这类问题时需要考虑数据依赖性和同步问题,以防止...

    中科曙光HPC培训教程汇总:D11-高性能集群性能评价—Stream.pptx

    在安装和测试 Stream 时,需要编译 Stream 代码,使用 icc 编译器,添加 -openmp 选项,以便启用多线程支持。 Stream_ARRAY_SIZE 是一个重要的参数,用于设置数组的大小,默认值为 10,000,000,可以根据需要进行调整...

    软件测试&oracle的笔试题,很重要

    1. 线程安全性:Vector是线程安全的,内部使用`synchronized`修饰方法,适合多线程环境;而ArrayList不是线程安全的,如果在多线程环境下使用,需要自行同步。 2. 性能:由于线程安全的实现,Vector的性能相对较低,...

    用C++编写图像缩放程序,采用双线性插值算法

    同时,为了提高效率,可以考虑使用多线程或并行计算技术,如OpenMP,尤其是在处理大尺寸图像时。 压缩包内的"www.pudn.com.txt"可能包含程序代码、教程链接或其他相关信息,而"图像缩放(线性)"可能是源代码文件或...

    矩阵相乘--线性代数

    为了优化性能,可以考虑使用多线程或并行计算,特别是在处理大矩阵时。例如,可以将矩阵分解为更小的块,然后并行计算这些块的乘积。 在测试代码`test.cpp`中,可能会包含单元测试用例,用于验证矩阵乘法的正确性。...

    卷积代码例程QT运行测试

    它提供了丰富的功能,包括窗口管理、网络通信、多线程支持和多媒体处理等。在QT中实现卷积代码,我们可以利用其强大的信号与槽机制以及高效的计算库来优化代码性能。例如,可以使用QVector或QList等容器存储数据,...

    Labview期末考试题及答案.pdf

    LabVIEW的并行处理能力可以实现多线程绘图,结合颜色编码来区分不同曲线。 12. **评分反馈系统**:根据分数给出不同的评价和反馈。这涉及到分数比较、指示灯控制和字符串显示。 13. **跑马灯模拟**:使用顺序结构...

    google面试题(部分)

    - **问题描述**:解决生产者消费者问题,这是一个多线程同步问题。 - **知识点**:并发编程,线程同步。 #### 16. 社交网络中的好友推荐 - **问题描述**:在一个社交网络图中实现好友推荐,找出共同好友最多的那个...

    matlab代码左移-floatingspeed:C,C++和Fortran中的浮点/RAM基准测试,包括复杂的算法

    r内核直接求和的多线程实现中比较各种语言的速度。 使用vscode在容器化的开发环境中打开 您可以用来打开容器化的开发环境。 这将创建一个Docker容器,其中预先安装了所有编译器和工具,包括Fortran,Python,Octave...

    今日头条2017校园招聘 java后台岗位面试题(1).pdf

    三面继续深入到Java多线程和MySQL索引,并结合应聘者的项目经验进行提问。最后一轮的HR面试则更加关注个人学习方法和态度,以了解其适应公司文化和团队合作的能力。 【知识点详解】: 1. **链表相加**:这是一个...

    长春径点科技笔试,一面,二面题

    二面可能涉及更具体的编程语言知识,如C#的多线程和网络通信(Socket),以及对不同平台项目开发的了解。 总的来说,长春径点科技的笔试和面试考察了应聘者全面的IT技能,包括理论知识、编程能力、问题解决技巧以及...

    Java并发编程实践-电子书-03章

    - **3.6.2 应用ParallelArray**:展示了如何使用并行数组(`ParallelArray`)来执行数组操作,如排序、求和等。 通过以上章节的详细讲解,读者可以深入理解Java并发编程的核心概念和技术,掌握在多线程环境中编写高...

    Java范例开发大全 (源程序)

     实例65 数组求和计算 90  实例66 求最大值、最小值和平均值 91  5.2 二维数组 92  实例67 二维数组的创建与使用 92  实例68 矩阵转置 93  实例69 奇数阶幻方 94  实例70 求方阵对角线之和 96  实例...

    java范例开发大全(pdf&源码)

    实例65 数组求和计算 90 实例66 求最大值、最小值和平均值 91 5.2 二维数组 92 实例67 二维数组的创建与使用 92 实例68 矩阵转置 93 实例69 奇数阶幻方 94 实例70 求方阵对角线之和 96 实例71 矩阵的加法 97 实例72 ...

    java范例开发大全源代码

     实例65 数组求和计算 90  实例66 求最大值、最小值和平均值 91  5.2 二维数组 92  实例67 二维数组的创建与使用 92  实例68 矩阵转置 93  实例69 奇数阶幻方 94  实例70 求方阵对角线之和 96 ...

    java范例开发大全

    实例65 数组求和计算 90 实例66 求最大值、最小值和平均值 91 5.2 二维数组 92 实例67 二维数组的创建与使用 92 实例68 矩阵转置 93 实例69 奇数阶幻方 94 实例70 求方阵对角线之和 96 实例71 矩阵的加法 97 实例72 ...

    CU Sketch算法实现

    - **并行处理**:如果数据量非常大,可以考虑利用多线程或分布式计算框架来加速处理速度。 - **错误容忍**:考虑到近似计数的特性,需要在设计中加入一定的容错机制,以应对可能出现的误差。 在压缩包中的文件"CU...

    correlation源码.zip

    6. **性能优化**:对于大规模数据,源码可能采用了并行计算或内存管理策略来提高计算效率,如使用多线程、多进程或GPU加速。 7. **测试代码**:源码可能还包含了单元测试或集成测试,用于验证算法的正确性,确保在...

    java实验矩阵相乘

    为了进一步提升效率,可以考虑使用Java的多线程来并行计算矩阵乘法,利用Java的并发库如`ExecutorService`和`Future`。此外,还可以探索高效的矩阵运算库,如Apache Commons Math或JBLAS,这些库提供了优化的矩阵...

    累加累减计算器.zip

    3. 并行计算:如果系统支持多线程或多进程,可以将计算任务分割,同时在多个处理器上进行,从而加快计算速度。 4. 数组或列表操作:利用数组或列表的内置方法,如numpy库在Python中的cumsum和cumprod,可以高效地...

Global site tag (gtag.js) - Google Analytics