`
543089122
  • 浏览: 149892 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

计算很大数组中List的和

    博客分类:
  • java
阅读更多
原帖地址:
http://www.iteye.com/topic/711162

package thread;

import java.util.Iterator;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CyclicBarrier;

public class SegmentCount {
	public static void main(String[] args) {
		int[] arr = new int[10123];
		Random ran = new Random();
		int sum = 0;
		for (int i = 0; i < arr.length; i++) {
			arr[i] = ran.nextInt(10000);
			sum += arr[i];
		}
		System.out.println("结果应该为:" + sum);

		// 多线程进行数组拆分计算
		int threadSize = 10;
		int avg = arr.length / threadSize;// 平均任务数
		int surplus = arr.length % threadSize;// 剩余任务数
		threadSize = surplus > 0 ? (++threadSize) : threadSize;
		final ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<Integer>();// 结果队列
		CyclicBarrier barrier = new CyclicBarrier(threadSize, new Runnable() {
			public void run() {
				System.out.println("统计:");
				System.out.println(queue);
				int sum = 0;
				Iterator<Integer> it = queue.iterator();
				while (it.hasNext()) {
					sum += Integer.valueOf(it.next().toString());
				}
				System.out.println("sum:" + sum);
			}
		});

		for (int i = 1; i <= threadSize; i++) {
			int end = i * avg;
			end = (end > arr.length) ? arr.length : end;
			new Thread(new Segment(barrier, arr, (i - 1) * avg, end, queue))
					.start();
		}
	}
}

class Segment implements Runnable {
	CyclicBarrier barrier;
	int[] arr;
	int start;
	int end;
	ConcurrentLinkedQueue<Integer> queue;

	public Segment(CyclicBarrier barrier, int[] arr, int start, int end,
			ConcurrentLinkedQueue<Integer> queue) {
		super();
		this.barrier = barrier;
		this.arr = arr;
		this.start = start;
		this.end = end;
		this.queue = queue;
	}

	int sum = 0;

	public void run() {
		System.out.println(Thread.currentThread().getName() + ",start:" + start
				+ ",end:" + end);
		for (int i = start; i < end; i++) {
			sum += arr[i];
		}
		queue.offer(sum);
		try {
			barrier.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
	}
}



package thread;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

public class SegmentCount2 {
	public static void main(String[] args) throws InterruptedException,
			ExecutionException {
		int[] arr = new int[10123];
		Random ran = new Random();
		int sum = 0;
		for (int i = 0; i < arr.length; i++) {
			arr[i] = ran.nextInt(10000);
			sum += arr[i];
		}
		System.out.println("结果应该为:" + sum);

		// 多线程进行数组拆分计算

		int threadSize = 10;
		int avg = arr.length / threadSize;// 平均任务数
		int surplus = arr.length % threadSize;// 剩余任务数
		threadSize = surplus > 0 ? (++threadSize) : threadSize;

		ExecutorService pool = Executors.newCachedThreadPool();
		List<Segment2> tasks = new ArrayList<Segment2>();
		for (int i = 1; i <= threadSize; i++) {
			int end = i * avg;
			end = (end > arr.length) ? arr.length : end;
			tasks.add(new Segment2(arr, (i - 1) * avg, end));
		}
		// 执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。
		List<Future<Integer>> result = pool.invokeAll(tasks);

		int summ = 0;
		for (int i = 0; i < result.size(); i++) {
			FutureTask<Integer> task = (FutureTask<Integer>) result.get(i);
			summ += Integer.valueOf(task.get().toString());
		}
		System.out.println("总共:" + summ);
		pool.shutdown();
	}
}

class Segment2 implements Callable<Integer> {
	int[] arr;
	int start;
	int end;

	public Segment2(int[] arr, int start, int end) {
		super();
		this.arr = arr;
		this.start = start;
		this.end = end;
	}

	int sum = 0;

	public Integer call() throws Exception {
		System.out.println(Thread.currentThread().getName() + ",start:" + start
				+ ",end:" + end);
		for (int i = start; i < end; i++) {
			sum += arr[i];
		}
		return sum;
	}
}



package thread;

import java.util.Iterator;
import java.util.Random;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;

public class SegmentCount3 {
	public static void main(String[] args) throws InterruptedException,
			ExecutionException {
		int[] arr = new int[10123];
		Random ran = new Random();
		int sum = 0;
		for (int i = 0; i < arr.length; i++) {
			arr[i] = ran.nextInt(10000);
			sum += arr[i];
		}
		System.out.println("结果应该为:" + sum);

		// 多线程进行数组拆分计算

		int threadSize = 10;
		int avg = arr.length / threadSize;// 平均任务数
		int surplus = arr.length % threadSize;// 剩余任务数
		threadSize = surplus > 0 ? (++threadSize) : threadSize;
		final ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<Integer>();// 结果队列
		CountDownLatch beginSignal = new CountDownLatch(1);
		CountDownLatch endSignal = new CountDownLatch(threadSize);

		for (int i = 1; i <= threadSize; i++) {
			int end = i * avg;
			end = (end > arr.length) ? arr.length : end;
			new Thread(new Segment3(beginSignal, endSignal, arr, (i - 1) * avg,
					end, queue)).start();
		}
		System.out.println("开闸");
		beginSignal.countDown();
		endSignal.await();
		System.out.println("统计:" + queue);
		Iterator<Integer> it = queue.iterator();
		int summ = 0;
		while (it.hasNext()) {
			summ += it.next();
		}
		System.out.println(summ);
	}
}

class Segment3 implements Runnable {
	CountDownLatch beginSignal;
	CountDownLatch endSignal;
	int[] arr;
	int start;
	int end;
	ConcurrentLinkedQueue<Integer> queue;

	public Segment3(CountDownLatch beginSignal, CountDownLatch endSignal,
			int[] arr, int start, int end, ConcurrentLinkedQueue<Integer> queue) {
		super();
		this.beginSignal = beginSignal;
		this.endSignal = endSignal;
		this.arr = arr;
		this.start = start;
		this.end = end;
		this.queue = queue;
	}

	int sum = 0;

	public void run() {
		try {
			beginSignal.await();

			System.out.println(Thread.currentThread().getName() + ",start:"
					+ start + ",end:" + end);

			for (int i = start; i < end; i++) {
				sum += arr[i];
			}
			queue.offer(sum);
			endSignal.countDown();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

分享到:
评论

相关推荐

    Arduino-List:实现动态数组的Arduino库

    更多信息使用说明List类的操作与C ++中的Vector类相似,但是其实现方式很简单,可以在像Arduino这样的处理器中使用。 但是,方法和变量的名称类似于C#中可用的通用List类,它更为现代和最新。 List类被初始化为...

    无限长整数的阶乘计算(10000!只需要0.187秒即可,数组型(窗口版)

    内部设计了一个Unlimit无限宽的整数,用多个uint拼接起来,直接采用二进制做乘法和加法运算,因此速度最快...只需要0.5秒即可)(窗口版)"不同之处在于改List类型为Array类型,这样做使数组下标计算的速度极大地提高了。

    Python如何实现动态数组

    在本博客中,我们将学习探讨Python的各种“序列”类,内置的三大常用数据结构——列表类(list)、元组类(tuple)和字符串类(str)。 不知道你发现没有,这些类都有一个很明显的共性,都可以用来保存多个数据元素...

    C语言程序设计标准教程

    因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。  “结构”是一种构造类型,它是由若干“成员...

    java源码包2

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    python的常用数组工具

    写在前面: ...在之前的基础上根据意见加入了文件读取的功能,用户可以直接在指定文件夹下新建一个data.txt来进行计算,这个在数据量大的情况下免去了一个个手动输入的麻烦,功能是一样的 from functools i

    学python必学的基础Numpy,免费学习numpy

    Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。 从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是...

    上海电机学院C语言实训答案

    (10)编写一个程序实现如下功能:调用名为tj的函数,求一个二维数组中正数、负数的代数和,以及零的个数。 (11)编写一个程序实现如下功能:调用一个名为gm的函数,该函数实现简单的加密。加密方法如下:先定义...

    Numpy常用操作及使用方法实例(源码演示版)

    这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数...

    java常用工具类的使用

    该类的大部分构造器和方法都已经过时,但是该类使用非常方便,因此目前使用还很普遍,该类的另一个主要功能是,在数据库操作中,它允许将毫秒值表示为SQL DATE值,是数据库操作中java.sql.Date的父类。关于数据库...

    list-methods-mini-lab-javascript

    无论您是计划聚会,创建客人名单,去杂货店购物和创建杂货店列表,还是与朋友就有史以来的前十部电影进行辩论,您都可能已经在数组形式中进行了很多思考。 作为程序员,数组成为强大的工具。 例如,如果您在纸上列...

    《你必须知道的495个C语言问题》

    书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 《你必须知道的495个C语言问题》结构...

    AIC的Java课程1-6章

    第3版 机械工业出版社  教学内容和要求 知识点 重要程度 使用频度 难度 Java 入门 高 中 易 变量和运算符 高 高 中 控制结构 高 高 易 数组 高 高 中 方法 很高 高 中 封装 很高 很高 难...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

    传智播客扫地僧视频讲义源码

    02_模板数组类_作业讲解和思想强化(数据类型和算法的分离)_传智扫地僧 03_类型转换_static_cast和reinterpret_cast 04_类型转换_dynamic_cast和reinterpret_cast_传智扫地僧 05_类型转换_const_cast 06_异常的基本...

    《数据结构 1800题》

    6.数据结构中评价算法的两个重要指标是(时间复杂度和空间复杂度) 【北京理工大学 2001 七、1(2分)】 7. 数据结构是研讨数据的_(1)物理结构_和_(2)逻辑结构 _,以及它们之间的相互关系,并对与这种结构定义...

Global site tag (gtag.js) - Google Analytics