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
分享到:
相关推荐
在多线程环境中,可以将大型矩阵的行或列分配给不同线程,同时进行计算,从而加快求解速度。equation_pthread.c文件可能实现了这样的并行算法。需要注意的是,解决这类问题时需要考虑数据依赖性和同步问题,以防止...
在安装和测试 Stream 时,需要编译 Stream 代码,使用 icc 编译器,添加 -openmp 选项,以便启用多线程支持。 Stream_ARRAY_SIZE 是一个重要的参数,用于设置数组的大小,默认值为 10,000,000,可以根据需要进行调整...
1. 线程安全性:Vector是线程安全的,内部使用`synchronized`修饰方法,适合多线程环境;而ArrayList不是线程安全的,如果在多线程环境下使用,需要自行同步。 2. 性能:由于线程安全的实现,Vector的性能相对较低,...
同时,为了提高效率,可以考虑使用多线程或并行计算技术,如OpenMP,尤其是在处理大尺寸图像时。 压缩包内的"www.pudn.com.txt"可能包含程序代码、教程链接或其他相关信息,而"图像缩放(线性)"可能是源代码文件或...
为了优化性能,可以考虑使用多线程或并行计算,特别是在处理大矩阵时。例如,可以将矩阵分解为更小的块,然后并行计算这些块的乘积。 在测试代码`test.cpp`中,可能会包含单元测试用例,用于验证矩阵乘法的正确性。...
它提供了丰富的功能,包括窗口管理、网络通信、多线程支持和多媒体处理等。在QT中实现卷积代码,我们可以利用其强大的信号与槽机制以及高效的计算库来优化代码性能。例如,可以使用QVector或QList等容器存储数据,...
LabVIEW的并行处理能力可以实现多线程绘图,结合颜色编码来区分不同曲线。 12. **评分反馈系统**:根据分数给出不同的评价和反馈。这涉及到分数比较、指示灯控制和字符串显示。 13. **跑马灯模拟**:使用顺序结构...
- **问题描述**:解决生产者消费者问题,这是一个多线程同步问题。 - **知识点**:并发编程,线程同步。 #### 16. 社交网络中的好友推荐 - **问题描述**:在一个社交网络图中实现好友推荐,找出共同好友最多的那个...
r内核直接求和的多线程实现中比较各种语言的速度。 使用vscode在容器化的开发环境中打开 您可以用来打开容器化的开发环境。 这将创建一个Docker容器,其中预先安装了所有编译器和工具,包括Fortran,Python,Octave...
三面继续深入到Java多线程和MySQL索引,并结合应聘者的项目经验进行提问。最后一轮的HR面试则更加关注个人学习方法和态度,以了解其适应公司文化和团队合作的能力。 【知识点详解】: 1. **链表相加**:这是一个...
二面可能涉及更具体的编程语言知识,如C#的多线程和网络通信(Socket),以及对不同平台项目开发的了解。 总的来说,长春径点科技的笔试和面试考察了应聘者全面的IT技能,包括理论知识、编程能力、问题解决技巧以及...
实例65 数组求和计算 90 实例66 求最大值、最小值和平均值 91 5.2 二维数组 92 实例67 二维数组的创建与使用 92 实例68 矩阵转置 93 实例69 奇数阶幻方 94 实例70 求方阵对角线之和 96 实例...
实例65 数组求和计算 90 实例66 求最大值、最小值和平均值 91 5.2 二维数组 92 实例67 二维数组的创建与使用 92 实例68 矩阵转置 93 实例69 奇数阶幻方 94 实例70 求方阵对角线之和 96 实例71 矩阵的加法 97 实例72 ...
实例65 数组求和计算 90 实例66 求最大值、最小值和平均值 91 5.2 二维数组 92 实例67 二维数组的创建与使用 92 实例68 矩阵转置 93 实例69 奇数阶幻方 94 实例70 求方阵对角线之和 96 ...
实例65 数组求和计算 90 实例66 求最大值、最小值和平均值 91 5.2 二维数组 92 实例67 二维数组的创建与使用 92 实例68 矩阵转置 93 实例69 奇数阶幻方 94 实例70 求方阵对角线之和 96 实例71 矩阵的加法 97 实例72 ...
- **并行处理**:如果数据量非常大,可以考虑利用多线程或分布式计算框架来加速处理速度。 - **错误容忍**:考虑到近似计数的特性,需要在设计中加入一定的容错机制,以应对可能出现的误差。 在压缩包中的文件"CU...
6. **性能优化**:对于大规模数据,源码可能采用了并行计算或内存管理策略来提高计算效率,如使用多线程、多进程或GPU加速。 7. **测试代码**:源码可能还包含了单元测试或集成测试,用于验证算法的正确性,确保在...
为了进一步提升效率,可以考虑使用Java的多线程来并行计算矩阵乘法,利用Java的并发库如`ExecutorService`和`Future`。此外,还可以探索高效的矩阵运算库,如Apache Commons Math或JBLAS,这些库提供了优化的矩阵...
3. 并行计算:如果系统支持多线程或多进程,可以将计算任务分割,同时在多个处理器上进行,从而加快计算速度。 4. 数组或列表操作:利用数组或列表的内置方法,如numpy库在Python中的cumsum和cumprod,可以高效地...