思路:把所有数据分组,每组使用一个线程去计算结果,计算完后再把结果汇总
具体实现如下:
1、用数据模拟文本里的数据
2、声明一个线程池和实现一个可返回结果的Callable接口
3、把果返回结果Future放到CopyOnWriteArrayList中用于结果集计算
4、此算法的缺点有待改进的地方是结果汇总时是被动去检测,而不是某个结果计算完成后主动去汇总,既然是分段计算,如果数据量足够大时,应该采用递归去实现分段汇总会更好
/** * Huisou.com Inc. * Copyright (c) 2011-2012 All Rights Reserved. */ package thread; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** * @description * * @author chenzehe * @email hljuczh@163.com * @create 2013-3-8 上午12:20:27 */ public class CalculateTest { public static void main(String[] args) { int[] intNums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 }; System.out.println("Calculate start..."); System.out.println("Calculate result:" + Calculate.calculate(intNums)); System.out.println("Calculate finished."); } } class Calculate { static int poolSize = 5; static ExecutorService executor = Executors.newFixedThreadPool(2); /** * * @param targetNum * @return * @description 使用多线程对targetNum数组求和 * @author chenzehe * @todo */ public static int calculate(int[] targetNum) { int result = 0; try { // 返回结果Future放到CopyOnWriteArrayList中用于结果集计算 List<Future<Integer>> futures = new CopyOnWriteArrayList<Future<Integer>>(); for (int i = 0; i < poolSize; i++) { // 提交任务 futures.add(executor.submit(new CalculateCallable(targetNum, poolSize, i))); } // 等待返回结果 while (true) { if (futures.size() == 0) { break;// 全部返回则跳出 } for (Future<Integer> future : futures) { System.out.println("waiting..."); if (future.isDone()) { result += future.get(); futures.remove(future);// 有返回结果就移出 } } } executor.shutdown(); } catch (Exception ex) { ex.printStackTrace(); } return result; } } class CalculateCallable implements Callable<Integer> { int[] targetNum; int threadNum; int poolSize; public CalculateCallable(int[] targetNum, int poolSize, int threadNum) { this.targetNum = targetNum; this.poolSize = poolSize; this.threadNum = threadNum; } @Override public Integer call() { // 根据某种算法算出这里需要读取某部分数据,此处只是简单平均 int result = 0; int eachSize = (targetNum.length + poolSize) / poolSize; int start = eachSize * threadNum; int end = start + eachSize; for (int i = start; i < end && i < targetNum.length; i++) { result += targetNum[i]; } try { // 模拟长时间的运算 Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; } }
此解决方案缺点现已使用JDK7中Fork-Join模式解决。
相关推荐
11. **线程安全**:线程安全的类或方法可以在多线程环境中被正确使用,不会因为并发访问而导致数据的不一致。Java提供了一些线程安全的集合类,如Vector、ConcurrentHashMap等。 12. **线程局部变量**:ThreadLocal...
### JAVA面试题——多线程知识点详解 #### 一、线程与进程的基本概念 线程和进程是并发编程中的两个基本概念。进程是操作系统进行资源分配和调度的基本单位,而线程则是进程中的实际运行单元。每一个进程都有其...
最全面的java面试题——选择题部分
HCIE 面试题——LAN&WAN 技术是一份关于 LAN&WAN 技术的面试题,涵盖了交换机端口类型、VLAN 帧的识别、数据帧的处理方式等多个方面的知识点。 交换机端口类型 交换机端口类型有四种:Access 接口、Trunk 接口、...
世界500强面试题——让你在面试时更有自信!
C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等
1. **线程与进程**:线程是进程内部的执行单元,每个进程至少有一个线程,多个线程可以共享同一进程的资源,而进程则是操作系统分配资源的基本单位,拥有独立的内存空间。 2. **并发与并行**:并发是指在同一时间段...
这是因为给出的文件信息中,标题为“银行面试真题——客户经理.pdf”,描述与标题相同,均为“银行面试真题——客户经理.pdf”,而标签部分为空。接着,您提供的部分内容是一串数字和符号,没有实际的文字内容,因此...
Java全能学习面试手册——Java面试题库.zip 01 7道消息队列ActiveMQ面试题!.pdf 02 10道Java高级必备的Netty面试题!.pdf 03 10道Java面试必备的设计模式面试题!.pdf 04 10个Java经典的List面试题!.pdf 05 10个...
Java全能学习面试手册——互联网企业面试真题.zip 01 java面试——北京-百度-Java中级.pdf 02 java面试——北京-京东-Java中级.pdf 03 java面试——广州-唯品会-Java大数据开发工程师.pdf 04 java面试——杭州-阿里...
java面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏...
"软通动力面试题——银行业务调度系统" 在本篇文章中,我们将对软通动力的银行业务调度系统面试题进行详细的分析和解释。该系统模拟了银行业务调度系统的逻辑,涵盖了客户分类、窗口管理、业务办理时间等多个方面。...
【标题】:“面试题——银行业务调度系统-源代码”涉及的是一个基于JavaSE的银行后台管理系统,旨在处理银行日常的业务调度问题。这个系统可能是为了模拟或优化银行内部的工作流程,例如账户管理、交易处理、客户...
多进程指的是在计算机系统中允许两个或两个以上进程同时运行,而多线程则是指一个进程中可以有多个独立运行的线程。在iOS中,由于ARM架构的CPU不支持真正的多核并行,多线程并发执行实际上是通过CPU快速切换任务实现...
网络编程中设计并发服务器可以使用多进程和多线程两种方法,两者的主要区别在于进程是拥有资源的一个独立单位,而线程是进程内的一个执行单元。 进程同步机制是指操作系统中用于同步进程之间的执行顺序的机制,包括...
三层交换机是一种多端口的路由器,它可以根据IP地址进行数据包的转发,而路由器则是负责将数据包从一个网络传输到另一个网络的设备。传统的路由器有三个特点:基于CPU的单步时钟处理机制、能够处理复杂的路由算法和...
面试题总结——多线程篇 一、多线程实现方式 多线程实现方式主要有四种:继承 Thread 类、实现 Runable 接口、实现 Callable 接口、通过 FutureTask 包装器。这四种方式可以满足不同的需求,例如继承 Thread 类...
搜狗公司的面试题目涵盖了多个领域,从公司介绍、校招信息、HR答疑,到薪酬待遇、笔试和面试经验,再到员工和营销感悟,最后到公司相关的历史、业务、文化和价值观。这一系列内容不仅让求职者对搜狗公司有了全面的...