`
543089122
  • 浏览: 152919 次
  • 性别: 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();
		}
	}
}

分享到:
评论

相关推荐

    Python 中数组和列表之间的区别

    Python 中数组和列表都是数据结构,但它们之间存在着很大的区别。本文将对 Python 中数组和列表进行深入分析,比较它们之间的区别。 Python 列表 Python 列表是一种内置数据结构,是包含在方括号 `[]` 的元素集合...

    VB 数组的初始化实例

    在VB中,可以创建零长度的数组,这在某些情况下可能很有用,例如等待用户输入数组大小后再进行初始化: ```vb Dim emptyArray() As String ``` 稍后,可以通过`ReDim`语句增加数组大小并赋值: ```vb ReDim empty...

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

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

    用数组实现线性表各种操作(C语言)完结

    这篇博客“用数组实现线性表各种操作(C语言)完结”很可能是详细介绍了如何使用C语言中的数组来构建并操作线性表。 线性表的操作主要包括: 1. 初始化:创建一个空的线性表,通常是在数组中分配空间,并将其长度设...

    1.6 编程基础之一维数组 python版.zip

    7. "09 向量点积计算.py":向量的点积运算在数学和物理学中很常见,这可能是将数学概念转化为编程问题。 8. "02 陶陶摘苹果.py":可能是一个模拟问题,比如陶陶每次可以摘到一定高度的苹果,数组记录苹果的高度,...

    python算法数据结构课程视频含代码之数组和动态数组1G

    数组是一种基本的数据结构,在Python中可以通过列表(List)来实现数组的功能。数组是具有相同数据类型的元素序列,这些元素按照一定的顺序排列,并且可以通过索引来访问每一个元素。 - **定义**: - 数组通常用于...

    java数组和链表数据结构的区别 数组和链表.pdf

    Java中的数组和链表是两种常见的线性数据结构,各有优缺点,适用于不同的场景。下面我们将详细探讨这两种数据结构的区别。 **数组(Array)** 数组是一种在内存中连续存储相同类型元素的数据结构。它的主要特点...

    考研数组和广义表答案.doc

    在计算机科学中,数组和广义表是两种重要的数据结构,它们在编程和算法设计中起着基础性的作用。下面将详细阐述这两种数据结构的概念、特点以及相关知识点。 数组是一种线性数据结构,由相同类型的数据元素组成。...

    后缀数组——罗穗骞附件(源码)

    后缀数组是字符串处理中的一个重要数据结构,尤其在算法竞赛(如OI)和文本处理领域广泛应用。罗穗骞,可能是某位知名的OI教练或专家,提供了关于后缀数组的源码和相关题目,帮助学习者深入理解这一概念。 后缀数组...

    chapter_5_基于数组的序列.zip

    这些操作在日常编程中极为常见,理解并熟练掌握它们对提高代码效率有很大帮助。 5. **列表方法(List Methods)**: Python列表提供了丰富的内置方法,如`append()`、`extend()`、`insert()`、`remove()`、`pop()`、...

    数据结构数组和广义表PPT学习教案.pptx

    数据结构中的数组和广义表是两种重要的数据组织方式,它们在编程和计算机科学中扮演着基础的角色。 数组,作为一种基本的数据结构,是程序设计语言中的固有类型。它由一组具有相同数据类型的元素组成,这些元素通过...

    二分查找(Binary Search)是一种在有序数组中查找某一特定元素的搜索算法.txt

    由于每次查找都将搜索范围减半,二分查找的时间复杂度为O(log n),其中n是数组中元素的数量,这使得它在大数据集上具有很高的效率。 在二分查找的实现过程中,通常使用两个指针left和right来表示当前的搜索范围。这...

    数组参考程序.rar

    4. **插入与删除**:在某些语言中,插入和删除操作可能涉及移动元素,比如在动态数组(如Python的list)中。 5. **排序**:使用内置函数或自定义算法对数组进行升序或降序排列。 6. **搜索**:查找数组中的特定元素...

    数组进阶示例.rar

    在这个"数组进阶示例.rar"中,我们可以看到一个名为"Test.java"的文件,这很可能是用Java语言编写的,用于演示数组的高级用法和技巧。Java是一种广泛应用的面向对象的编程语言,它对数组的支持非常全面。 1. **数组...

    第五章++数组和广义表.ppt

    这种顺序存储方法使得数组的访问效率很高,因为可以通过下标直接计算出元素在内存中的位置。 矩阵的压缩存储主要针对特殊的矩阵,如特殊矩阵(对角矩阵、单位矩阵等)和稀疏矩阵(大部分元素为0的矩阵)。对于特殊...

    基于springboot的4个常见的复杂请求Demo,含实体嵌套List提交、通文件上传、List提交、数组Array提交

    // 处理逻辑,如计算数组总和 } ``` 客户端发送一个JSON数组,如`[1, 2, 3]`,Spring Boot会将其转换为`int[]`数组。 总结来说,Spring Boot提供了一套强大的工具来处理各种复杂的HTTP请求。通过`@RequestBody`和...

    用数组实现线性表的各种操作(C语言)只完成一部分功能,明日继续

    6. 遍历:按照顺序访问线性表中的所有元素,这在打印、计算或处理整个表时很有用。 7. 计算长度:返回线性表中元素的数量。 在C语言中,这些操作可以通过定义一个结构体来实现,结构体包含数组和表示当前元素数量...

    完整版子程序返回数组演示.rar

    此外,如果数组很大,返回整个数组可能影响性能。因此,有时会返回数组的引用或指针,但这需要谨慎处理,避免内存泄漏。 7. **语言特性的差异**:不同的编程语言处理子程序返回数组的方式有所不同。例如,静态类型...

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

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

    Python如何实现动态数组

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

Global site tag (gtag.js) - Google Analytics