思路:把所有数据分组,每组使用一个线程去计算结果,计算完后再把结果汇总
具体实现如下:
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模式解决。
相关推荐
JAVA面试题——多线程
最全面的java面试题——选择题部分
此文档中有java面试题中常考到的数据结构的知识,面试必备。
多线程面试题
世界500强面试题——让你在面试时更有自信!
2023前端最新面试题——Vue篇2023前端最新面试题——Vue篇2023前端最新面试题——Vue篇2023前端最新面试题——Vue篇2023前端最新面试题——Vue篇...2023前端最新面试题——Vue篇2023前端最新面试题——Vue篇2023前端最
CCNA面试题——网络工程师
C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等
Java全能学习面试手册——Java面试题库.zip 01 7道消息队列ActiveMQ面试题!.pdf 02 10道Java高级必备的Netty面试题!.pdf 03 10道Java面试必备的设计模式面试题!.pdf 04 10个Java经典的List面试题!.pdf 05 10个...
java面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏...
面试题解惑系列(十)——话说多线程面试题解惑系列(十)——话说多线程面试题解惑系列(十)——话说多线程
2023前端最新面试题——Vue篇.docx2023前端最新面试题——Vue篇.docx2023前端最新面试题——Vue篇.docx2023前端最新面试题——Vue篇.docx2023前端最新面试题——Vue篇.docx2023前端最新面试题——Vue篇.docx2023前端...
HCIE面试题——LAN&WAN 技术.docx
2024年秋招and春招面试真题——中软.txt2024年秋招and春招面试真题——中软.txt2024年秋招and春招面试真题——中软.txt2024年秋招and春招面试真题——中软.txt2024年秋招and春招面试真题——中软.txt2024年秋招and...
2022前端面试系列——Vue面试题.pdf
这是java程序员面试题的总结,非常经典,来自于河南省863软件孵化器有限公司。对于有一定技术,面试却总是失败的朋友很有帮助。
UC面试题,里面包含uc经典面试题,是准备找uc工作的人的首选。
2021Java大厂面试题——大厂真题之拼多多-Java高级.pdf
网络工程师面试题——CCNA.doc
面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统 面试题c++mysql多线程操作系统