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

25 篇文章 0 订阅
1 篇文章 0 订阅

java用多线程进行链表求和

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

物理硬件

cpu属性
硬盘信息

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的运算结果
10000的运算结果

100000的运算结果
100000的运算结果

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

扩展

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

结束语

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值