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
分享到:
相关推荐
VC多线程实现数组排序VC多线程实现数组排序VC多线程实现数组排序VC多线程实现数组排序VC多线程实现数组排序
多线程使用同一个数组引起错误的可能性分析,经目前测试,在经过了30万次运算后,没有出现错误,不知道是不是测试正确,求高手指点。
主要为大家详细介绍了C#多线程数组模拟socket的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
很复杂,很复杂,值得研究,但不适合做游戏。
实验班 08 使用线程对 C 中的数组求和
实现了数组相乘的并行计算,任意输入线程数,数组长度
是多线程的测试,对学习多线程的朋友有用,使用C#2008来编写的,需要的朋友可以去下载
winform中的多线程求和
细节参考:http://blog.csdn.net/qq_17239003/article/details/78824004#0-qzone-1-33634-d020d2d2a4e8d1a374a433f596ad1440
Java数组 Java环境配置 Java多线程编程 分别为三个PDF文件
一个测试多线程的例子,程序先随机生成100个数字,然后多线程访问百度搜索这些随机数字,并返回搜索到的结果数量。
包括 win32API+C运行时库多线程 和 C++11多线程 测试代码。 环境:win7+vs2015
从键盘接收一个数x,然后用多线程并发查找x在数组中的所有下标位置。 查找线程的构造函数形参如下所示: 数组名, 查找范围(起始下标、结束下标) 每个线程体在查找范围内顺序查找,并将该范围内所有找到的x的下标记录...
WEB API 多线程并发测试工具; WEB API 多线程并发测试工具
包含多线程,runtime 测试用例,配合博客文章,实例测试,可打开注释直接运行~
基于Java多线程隐藏数组下标变换表达式的代码迷惑算法.pdf
易语言多线程传递多参数源码,多线程传递多参数,子程序11,子程序1
多线程测试,多线程测试,多线程测试,多线程测试
现代多线程 JAVA和c++多线程实现 测试和调试