java用多线程进行链表求和器

    xiaoxiao2021-03-26  46

    java用多线程进行链表求和

    上周不知在哪里看到几个大神们在讨论利用多线程对Integer链表进行求和,周末刚好没事,就自己动手实践了一下!

    物理硬件

    ps:系统为固态硬盘

    jdk版本:1.8

    接口

    import java.util.List; //多线程计算的接口 public interface Calculate extends Runnable{ public void calculate(List<Integer> list); //计算的实现 public void returnResult(StatisticsRestult s);//结果返回 } //结果统计的接口 public interface StatisticsRestult { public void statistic(int result); //统计计算结果 }

    实现类

    import java.util.List; //多线程计算的实现类 public class CalculateImp implements Calculate { private int result = 0; //结果 private List<Integer> list;//计算的链表 private int end;//链表的结束位置 private int start;//链表的开始位置 private StatisticsRestult statistics;//计算结果返回的对象 /** * @goal 构造函数 * @author Jason * @param list * @param statistics */ public CalculateImp(List<Integer> list, StatisticsRestult statistics) { this(list, statistics, 0, 0); } public CalculateImp(List<Integer> list, StatisticsRestult statistics, int start, int end) { this.list = list; this.statistics = statistics; this.start = start; this.end = end; } /** * @goal:计算的实现方法 * @author Jason * @param list */ @Override public void calculate(List<Integer> list) { if (list.size() == 0) { returnResult(statistics); return; } for (int i = start; i < end; i++) { result += list.get(i); } returnResult(statistics); } /** * @goal :计算结果的返回方法 * @author Jason * @param result */ @Override public void returnResult(StatisticsRestult s) { s.statistic(result); } /** * @goal:多线程的启动 * @author Jason * */ @Override public void run() { calculate(list); } } import java.util.List; public class StatisticsResultImp implements StatisticsRestult { private int total; //最终结果 public int threadSize = -1; //正在运行的线程个数 public Long startTime;//开始时间 public Long endTime;//结束时间 /** * @goal 开始计算的入口 * @author Jason * @param list */ public void startCalculate(List<Integer> list) { startTime = System.currentTimeMillis(); threadSize = (list.size() / 10000) + 1; //计算需要的线程数 for(int i =0;i<threadSize;i++){ Calculate calculate= new CalculateImp(list,this,i*10000,list.size()>(i+1)*10000?(i+1)*10000:list.size()); new Thread(calculate).start(); } } /** * @goal:得到结果的回调函数 * @author Jason * @paramresult */ @Override public void statistic(int result) { threadSize--; total += result; if (threadSize == 0) { endTime=System.currentTimeMillis(); reset(); System.out.println("结果:"+total); System.out.println("用时:"+(endTime-startTime)); } } public void reset(){ threadSize=-1; } }

    测试方法

    import java.util.LinkedList; import java.util.List; public class Main { static List<Integer> number=new LinkedList<Integer>(); //计算的链表 /** * @goal:产生计算的链表 * @author Jason * @param size */ public static void createNumber(int size){ for(int i=0;i<=size;i++){ number.add(i); } } /** * @goal:主函数 * @author Jason * @param args */ public static void main(String[] args) { createNumber(1000000); //单线程计算 int result =0; Long startTime=System.currentTimeMillis(); for(int i=0;i<number.size();i++){ result+=number.get(i); } long endTime = System.currentTimeMillis(); System.out.println("结果:"+result); System.out.println("单线程用时"+(endTime-startTime)); //多线程计算 StatisticsResultImp calculate = new StatisticsResultImp(); startTime=System.currentTimeMillis(); calculate.startCalculate(number); } }

    结果截图

    10000的运算结果

    100000的运算结果

    1000000的运算结果 基本可以认为在我的电脑上采用多线程计算结果可以加快一倍!

    扩展

    当然,对于多线程计算,我们可以调节线程计算个数的力度.从而求的最合理的范围,大家有兴趣的可以自己去试试!

    结束语

    本人也是菜鸟一枚!如果有什么不足之处也希望大家谅解!

    转载请注明原文地址: https://ju.6miu.com/read-550236.html

    最新回复(0)